mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: new bitSet class and improved PackedList class (closes #751)
- The bitSet class replaces the old PackedBoolList class.
The redesign provides better block-wise access and reduced method
calls. This helps both in cases where the bitSet may be relatively
sparse, and in cases where advantage of contiguous operations can be
made. This makes it easier to work with a bitSet as top-level object.
In addition to the previously available count() method to determine
if a bitSet is being used, now have simpler queries:
- all() - true if all bits in the addressable range are empty
- any() - true if any bits are set at all.
- none() - true if no bits are set.
These are faster than count() and allow early termination.
The new test() method tests the value of a single bit position and
returns a bool without any ambiguity caused by the return type
(like the get() method), nor the const/non-const access (like
operator[] has). The name corresponds to what std::bitset uses.
The new find_first(), find_last(), find_next() methods provide a faster
means of searching for bits that are set.
This can be especially useful when using a bitSet to control an
conditional:
OLD (with macro):
forAll(selected, celli)
{
if (selected[celli])
{
sumVol += mesh_.cellVolumes()[celli];
}
}
NEW (with const_iterator):
for (const label celli : selected)
{
sumVol += mesh_.cellVolumes()[celli];
}
or manually
for
(
label celli = selected.find_first();
celli != -1;
celli = selected.find_next()
)
{
sumVol += mesh_.cellVolumes()[celli];
}
- When marking up contiguous parts of a bitset, an interval can be
represented more efficiently as a labelRange of start/size.
For example,
OLD:
if (isA<processorPolyPatch>(pp))
{
forAll(pp, i)
{
ignoreFaces.set(i);
}
}
NEW:
if (isA<processorPolyPatch>(pp))
{
ignoreFaces.set(pp.range());
}
This commit is contained in:
@ -122,7 +122,7 @@ int main(int argc, char *argv[])
|
|||||||
fvc::makeAbsolute(phi, rho, U);
|
fvc::makeAbsolute(phi, rho, U);
|
||||||
|
|
||||||
// Test : disable refinement for some cells
|
// Test : disable refinement for some cells
|
||||||
PackedBoolList& protectedCell =
|
bitSet& protectedCell =
|
||||||
refCast<dynamicRefineFvMesh>(mesh).protectedCell();
|
refCast<dynamicRefineFvMesh>(mesh).protectedCell();
|
||||||
|
|
||||||
if (protectedCell.empty())
|
if (protectedCell.empty())
|
||||||
|
|||||||
@ -2,8 +2,8 @@
|
|||||||
interpolationCellPoint<vector> UInterpolator(HbyA);
|
interpolationCellPoint<vector> UInterpolator(HbyA);
|
||||||
|
|
||||||
// Determine faces on outside of interpolated cells
|
// Determine faces on outside of interpolated cells
|
||||||
PackedBoolList isOwnerInterpolatedFace(mesh.nInternalFaces());
|
bitSet isOwnerInterpolatedFace(mesh.nInternalFaces());
|
||||||
PackedBoolList isNeiInterpolatedFace(mesh.nInternalFaces());
|
bitSet isNeiInterpolatedFace(mesh.nInternalFaces());
|
||||||
|
|
||||||
// Determine donor cells
|
// Determine donor cells
|
||||||
labelListList donorCell(mesh.nInternalFaces());
|
labelListList donorCell(mesh.nInternalFaces());
|
||||||
@ -175,11 +175,11 @@ surfaceVectorField faceNormals(mesh.Sf()/mesh.magSf());
|
|||||||
forAll(isNeiInterpolatedFace, faceI)
|
forAll(isNeiInterpolatedFace, faceI)
|
||||||
{
|
{
|
||||||
label cellId = -1;
|
label cellId = -1;
|
||||||
if (isNeiInterpolatedFace[faceI])
|
if (isNeiInterpolatedFace.test(faceI))
|
||||||
{
|
{
|
||||||
cellId = mesh.faceNeighbour()[faceI];
|
cellId = mesh.faceNeighbour()[faceI];
|
||||||
}
|
}
|
||||||
else if (isOwnerInterpolatedFace[faceI])
|
else if (isOwnerInterpolatedFace.test(faceI))
|
||||||
{
|
{
|
||||||
cellId = mesh.faceOwner()[faceI];
|
cellId = mesh.faceOwner()[faceI];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -474,7 +474,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
PackedBoolList select = HashSetOps::bitset(locations);
|
bitSet select = HashSetOps::bitset(locations);
|
||||||
auto output = ListOps::createWithValue<label>
|
auto output = ListOps::createWithValue<label>
|
||||||
(
|
(
|
||||||
30,
|
30,
|
||||||
@ -482,8 +482,8 @@ int main(int argc, char *argv[])
|
|||||||
100,
|
100,
|
||||||
-1 // default value
|
-1 // default value
|
||||||
);
|
);
|
||||||
Info<< "with PackedBoolList: " << flatOutput(output)
|
Info<< "with bitSet: " << flatOutput(output)
|
||||||
<< " selector: " << flatOutput(select.used()) << nl;
|
<< " selector: " << flatOutput(select.toc()) << nl;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
@ -516,7 +516,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
PackedBoolList select = HashSetOps::bitset(locations);
|
bitSet select = HashSetOps::bitset(locations);
|
||||||
auto output = ListOps::createWithValue<label>
|
auto output = ListOps::createWithValue<label>
|
||||||
(
|
(
|
||||||
30,
|
30,
|
||||||
@ -524,7 +524,7 @@ int main(int argc, char *argv[])
|
|||||||
100,
|
100,
|
||||||
-1 // default value
|
-1 // default value
|
||||||
);
|
);
|
||||||
Info<< "with PackedBoolList: " << flatOutput(output)
|
Info<< "with bitSet: " << flatOutput(output)
|
||||||
<< " selector: " << flatOutput(HashSetOps::used(select))
|
<< " selector: " << flatOutput(HashSetOps::used(select))
|
||||||
<< nl;
|
<< nl;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -145,7 +145,7 @@ int main(int argc, char *argv[])
|
|||||||
Info<<"Test reorder - oldToNew:" << nl
|
Info<<"Test reorder - oldToNew:" << nl
|
||||||
<< flatOutput(oldToNew) << nl << nl;
|
<< flatOutput(oldToNew) << nl << nl;
|
||||||
|
|
||||||
PackedBoolList bitset
|
bitSet bitset
|
||||||
(
|
(
|
||||||
ListOps::createWithValue<bool>
|
ListOps::createWithValue<bool>
|
||||||
(
|
(
|
||||||
|
|||||||
@ -32,7 +32,7 @@ Description
|
|||||||
#include "IOobject.H"
|
#include "IOobject.H"
|
||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "IFstream.H"
|
#include "IFstream.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include <climits>
|
#include <climits>
|
||||||
|
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ int main(int argc, char *argv[])
|
|||||||
IFstream ifs(srcFile);
|
IFstream ifs(srcFile);
|
||||||
List<label> rawLst(ifs);
|
List<label> rawLst(ifs);
|
||||||
|
|
||||||
PackedBoolList packLst(rawLst);
|
bitSet packLst(rawLst);
|
||||||
|
|
||||||
Info<< "size: " << packLst.size() << nl;
|
Info<< "size: " << packLst.size() << nl;
|
||||||
|
|
||||||
|
|||||||
@ -28,61 +28,100 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "uLabel.H"
|
#include "uLabel.H"
|
||||||
|
#include "labelRange.H"
|
||||||
|
#include "bitSet.H"
|
||||||
|
#include "FlatOutput.H"
|
||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "PackedBoolList.H"
|
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Ostream& report
|
||||||
|
(
|
||||||
|
const PackedList<Width>& list,
|
||||||
|
bool showBits = false,
|
||||||
|
bool debugOutput = false
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Info<< list.info();
|
||||||
|
if (showBits)
|
||||||
|
{
|
||||||
|
list.printBits(Info, debugOutput) << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Ostream& report
|
||||||
|
(
|
||||||
|
const bitSet& bitset,
|
||||||
|
bool showBits = false,
|
||||||
|
bool debugOutput = false
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Info<< bitset.info();
|
||||||
|
Info<< "all:" << bitset.all()
|
||||||
|
<< " any:" << bitset.any()
|
||||||
|
<< " none:" << bitset.none() << nl;
|
||||||
|
|
||||||
|
if (showBits)
|
||||||
|
{
|
||||||
|
bitset.printBits(Info, debugOutput) << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Info;
|
||||||
|
}
|
||||||
|
|
||||||
|
// BitOps::printBits((Info<< list1.info()), true) << nl;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
// Main program:
|
// Main program:
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
Info<< "PackedList max_bits() = " << PackedList<>::max_bits() << nl;
|
|
||||||
|
|
||||||
Info<< "\ntest allocation with value\n";
|
Info<< "\ntest allocation with value\n";
|
||||||
PackedList<3> list1(5,1);
|
PackedList<3> list1(5,1);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign uniform value\n";
|
Info<< "\ntest assign uniform value\n";
|
||||||
list1 = 3;
|
list1 = 3;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign uniform value (with overflow)\n";
|
Info<< "\ntest assign uniform value (with overflow)\n";
|
||||||
list1 = -1;
|
list1 = -1;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest zero\n";
|
Info<< "\ntest zero\n";
|
||||||
list1 = 0;
|
list1 = 0;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest set() with default argument (max_value)\n";
|
Info<< "\ntest set() with default argument (max_value)\n";
|
||||||
list1.set(1);
|
list1.set(1);
|
||||||
list1.set(3);
|
list1.set(3);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest unset() with in-range and out-of-range\n";
|
Info<< "\ntest unset() with in-range and out-of-range\n";
|
||||||
list1.unset(3);
|
list1.unset(3);
|
||||||
list1.unset(100000);
|
list1.unset(100000);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign between references\n";
|
Info<< "\ntest assign between references\n";
|
||||||
list1[2] = 3;
|
list1[2] = 3;
|
||||||
list1[4] = list1[2];
|
list1[4] = list1[2];
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign between references, with chaining\n";
|
Info<< "\ntest assign between references, with chaining\n";
|
||||||
list1[0] = 1;
|
list1[0] = 1;
|
||||||
list1[4] = 1;
|
list1[4] = 1;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign between references, with chaining and auto-vivify\n";
|
Info<< "\ntest assign between references, with chaining and auto-vivify\n";
|
||||||
list1[1] = 2;
|
list1[1] = 2;
|
||||||
list1[8] = 2;
|
list1[8] = 2;
|
||||||
list1[10] = 2;
|
list1[10] = 2;
|
||||||
list1[14] = 2;
|
list1[14] = 2;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
|
|
||||||
Info<< "\ntest operator== between references\n";
|
Info<< "\ntest operator== between references\n";
|
||||||
if (list1[1] == list1[8])
|
if (list1[1] == list1[8])
|
||||||
@ -106,7 +145,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
const PackedList<3>& constLst = list1;
|
const PackedList<3>& constLst = list1;
|
||||||
Info<< "\ntest operator[] const with out-of-range index\n";
|
Info<< "\ntest operator[] const with out-of-range index\n";
|
||||||
constLst.printInfo(Info, true);
|
|
||||||
|
report(constLst);
|
||||||
|
|
||||||
if (constLst[20])
|
if (constLst[20])
|
||||||
{
|
{
|
||||||
Info<< "[20] is true (unexpected)\n";
|
Info<< "[20] is true (unexpected)\n";
|
||||||
@ -116,7 +157,7 @@ int main(int argc, char *argv[])
|
|||||||
Info<< "[20] is false (expected) list size should be unchanged "
|
Info<< "[20] is false (expected) list size should be unchanged "
|
||||||
<< "(const)\n";
|
<< "(const)\n";
|
||||||
}
|
}
|
||||||
constLst.printInfo(Info, true);
|
report(constLst);
|
||||||
|
|
||||||
Info<< "\ntest operator[] non-const with out-of-range index\n";
|
Info<< "\ntest operator[] non-const with out-of-range index\n";
|
||||||
if (list1[20])
|
if (list1[20])
|
||||||
@ -128,7 +169,8 @@ int main(int argc, char *argv[])
|
|||||||
Info<< "[20] is false (expected) but list was resized?? "
|
Info<< "[20] is false (expected) but list was resized?? "
|
||||||
<< "(non-const)\n";
|
<< "(non-const)\n";
|
||||||
}
|
}
|
||||||
list1.printInfo(Info, true);
|
|
||||||
|
report(list1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -137,94 +179,94 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
Info<< "[20] is false, as expected\n";
|
Info<< "[20] is false, as expected\n";
|
||||||
}
|
}
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest resize with value (without reallocation)\n";
|
Info<< "\ntest resize with value (without reallocation)\n";
|
||||||
list1.resize(8, list1.max_value());
|
list1.resize(8, list1.max_value);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest flip() function\n";
|
Info<< "\ntest flip() function\n";
|
||||||
list1.flip();
|
list1.flip();
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\nre-flip()\n";
|
Info<< "\nre-flip()\n";
|
||||||
list1.flip();
|
list1.flip();
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest set() function\n";
|
Info<< "\ntest set() function\n";
|
||||||
list1.set(1, 5);
|
list1.set(1, 5);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign bool\n";
|
Info<< "\ntest assign bool\n";
|
||||||
list1 = false;
|
list1 = false;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest assign bool\n";
|
Info<< "\ntest assign bool\n";
|
||||||
list1 = true;
|
list1 = true;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest resize without value (with reallocation)\n";
|
Info<< "\ntest resize without value (with reallocation)\n";
|
||||||
list1.resize(12);
|
list1.resize(12);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest resize with value (with reallocation)\n";
|
Info<< "\ntest resize with value (with reallocation)\n";
|
||||||
list1.resize(25, list1.max_value());
|
list1.resize(25, list1.max_value);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest resize smaller (should not touch allocation)\n";
|
Info<< "\ntest resize smaller (should not touch allocation)\n";
|
||||||
list1.resize(8);
|
list1.resize(8);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest append() operation\n";
|
Info<< "\ntest append() operation\n";
|
||||||
list1.append(2);
|
list1.append(2);
|
||||||
list1.append(3);
|
list1.append(3);
|
||||||
list1.append(4);
|
list1.append(4);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest reserve() operation\n";
|
Info<< "\ntest reserve() operation\n";
|
||||||
list1.reserve(32);
|
list1.reserve(32);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest shrink() operation\n";
|
Info<< "\ntest shrink() operation\n";
|
||||||
list1.shrink();
|
list1.shrink();
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest setCapacity() operation\n";
|
Info<< "\ntest setCapacity() operation\n";
|
||||||
list1.setCapacity(15);
|
list1.setCapacity(15);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest setCapacity() operation\n";
|
Info<< "\ntest setCapacity() operation\n";
|
||||||
list1.setCapacity(100);
|
list1.setCapacity(100);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest operator[] assignment\n";
|
Info<< "\ntest operator[] assignment\n";
|
||||||
list1[16] = 5;
|
list1[16] = 5;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest operator[] assignment with auto-vivify\n";
|
Info<< "\ntest operator[] assignment with auto-vivify\n";
|
||||||
list1[36] = list1.max_value();
|
list1[36] = list1.max_value;
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest setCapacity smaller\n";
|
Info<< "\ntest setCapacity smaller\n";
|
||||||
list1.setCapacity(24);
|
list1.setCapacity(24);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest resize much smaller\n";
|
Info<< "\ntest resize much smaller\n";
|
||||||
list1.resize(150);
|
list1.resize(150);
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest trim\n";
|
Info<< "\ntest trim\n";
|
||||||
list1.trim();
|
list1.trim();
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
// add in some misc values
|
// Add in some misc values
|
||||||
list1[31] = 1;
|
list1[31] = 1;
|
||||||
list1[32] = 2;
|
list1[32] = 2;
|
||||||
list1[33] = 3;
|
list1[33] = 3;
|
||||||
|
|
||||||
Info<< "\ntest get() method\n";
|
Info<< "\ntest get() method\n";
|
||||||
Info<< "get(10):" << list1.get(10) << " and list[10]:" << list1[10] << "\n";
|
Info<< "get(10):" << list1.get(10) << " and list[10]:" << list1[10] << "\n";
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "\ntest operator[] auto-vivify\n";
|
Info<< "\ntest operator[] auto-vivify\n";
|
||||||
Info<< "size:" << list1.size() << "\n";
|
Info<< "size:" << list1.size() << "\n";
|
||||||
@ -234,33 +276,34 @@ int main(int argc, char *argv[])
|
|||||||
Info<< "list[45]:" << val << "\n";
|
Info<< "list[45]:" << val << "\n";
|
||||||
Info<< "size after read:" << list1.size() << "\n";
|
Info<< "size after read:" << list1.size() << "\n";
|
||||||
|
|
||||||
list1[45] = list1.max_value();
|
list1[45] = list1.max_value;
|
||||||
Info<< "size after write:" << list1.size() << "\n";
|
Info<< "size after write:" << list1.size() << "\n";
|
||||||
Info<< "list[45]:" << list1[45] << "\n";
|
Info<< "list[45]:" << list1[45] << "\n";
|
||||||
list1[49] = list1[100];
|
list1[49] = list1[100];
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
|
|
||||||
Info<< "\ntest copy constructor + append\n";
|
Info<< "\ntest copy constructor + append\n";
|
||||||
PackedList<3> list2(list1);
|
PackedList<3> list2(list1);
|
||||||
list2.append(4);
|
list2.append(4);
|
||||||
Info<< "source list:\n";
|
Info<< "source list:\n";
|
||||||
list1.printInfo(Info, true);
|
report(list1);
|
||||||
|
|
||||||
Info<< "destination list:\n";
|
Info<< "destination list:\n";
|
||||||
list2.printInfo(Info, true);
|
report(list2);
|
||||||
|
|
||||||
Info<< "\ntest pattern that fills all bits\n";
|
Info<< "\ntest pattern that fills all bits\n";
|
||||||
PackedList<4> list3(8, 8);
|
PackedList<4> list3(8, 8);
|
||||||
|
|
||||||
label pos = list3.size() - 1;
|
label pos = list3.size() - 1;
|
||||||
|
|
||||||
list3[pos--] = list3.max_value();
|
list3[pos--] = list3.max_value;
|
||||||
list3[pos--] = 0;
|
list3[pos--] = 0;
|
||||||
list3[pos--] = list3.max_value();
|
list3[pos--] = list3.max_value;
|
||||||
list3.printInfo(Info, true);
|
report(list3);
|
||||||
|
|
||||||
Info<< "removed final value: " << list3.remove() << endl;
|
Info<< "removed final value: " << list3.remove() << endl;
|
||||||
list3.printInfo(Info, true);
|
report(list3);
|
||||||
|
|
||||||
Info<<"list: " << list3 << endl;
|
Info<<"list: " << list3 << endl;
|
||||||
|
|
||||||
@ -289,18 +332,117 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PackedBoolList listb(list4);
|
bitSet listb(list4);
|
||||||
|
|
||||||
Info<< "copied from bool list " << endl;
|
Info<< "copied from bool list " << endl;
|
||||||
listb.printInfo(Info, true);
|
// report(listb);
|
||||||
|
|
||||||
{
|
{
|
||||||
labelList indices = listb.used();
|
labelList indices = listb.toc();
|
||||||
|
|
||||||
Info<< "indices: " << indices << endl;
|
Info<< "indices: " << indices << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Info<< nl
|
||||||
|
<< "resizing: " << nl;
|
||||||
|
{
|
||||||
|
PackedList<1> list1(81, 1);
|
||||||
|
PackedList<3> list3(27, 5); // ie, 101
|
||||||
|
|
||||||
|
Info<< "initial" << nl; report(list1, true);
|
||||||
|
Info<< "initial" << nl; report(list3, true);
|
||||||
|
|
||||||
|
list1.resize(118, 1);
|
||||||
|
list3.resize(37, 3);
|
||||||
|
Info<< "extend with val" << nl; report(list1, true);
|
||||||
|
Info<< "extend with val" << nl; report(list3, true);
|
||||||
|
|
||||||
|
list1.resize(90, 0);
|
||||||
|
list3.resize(30, 4);
|
||||||
|
|
||||||
|
Info<< "contract with val" << nl; report(list1, true);
|
||||||
|
Info<< "contract with val" << nl; report(list3, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
bitSet bits(45);
|
||||||
|
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits = true;
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.unset(35);
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.resize(39);
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
Info<< "values:" << flatOutput(bits.values()) << nl;
|
||||||
|
Info<< "used:" << flatOutput(bits.toc()) << nl;
|
||||||
|
|
||||||
|
bits.unset(labelRange(-15, 8));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(-15, 100));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(-15, 100));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(150, 15));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
bits.set(labelRange(0, 5));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
|
||||||
|
bits.reset();
|
||||||
|
bits.resize(50);
|
||||||
|
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
bits.set(labelRange(4, 8));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(30, 35));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(80, 12));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.unset(labelRange(35, 16));
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.unset(labelRange(0, 50));
|
||||||
|
bits.resize(100000);
|
||||||
|
bits.set(labelRange(30, 6));
|
||||||
|
bits[33] = false;
|
||||||
|
|
||||||
|
Info<<"used: " << flatOutput(bits.toc()) << endl;
|
||||||
|
|
||||||
|
Info<<"first: " << bits.find_first() << endl;
|
||||||
|
Info<<"next: " << bits.find_next(29) << endl;
|
||||||
|
Info<<"next: " << bits.find_next(30) << endl;
|
||||||
|
Info<<"next: " << bits.find_next(31) << endl;
|
||||||
|
|
||||||
|
Info<<"next: " << bits.find_next(31) << endl;
|
||||||
|
|
||||||
|
bits.set(labelRange(80, 10));
|
||||||
|
bits.resize(100);
|
||||||
|
Info<< "bits" << nl; report(bits, true);
|
||||||
|
|
||||||
|
bits.set(labelRange(125, 10));
|
||||||
|
|
||||||
|
Info<<"next: " << bits.find_next(64) << endl;
|
||||||
|
Info<<"used: " << flatOutput(bits.toc()) << endl;
|
||||||
|
|
||||||
|
for (const auto pos : bits)
|
||||||
|
{
|
||||||
|
Info<<"have: " << pos << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
Info<< "\n\nDone.\n";
|
Info<< "\n\nDone.\n";
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -29,7 +29,7 @@ Description
|
|||||||
|
|
||||||
#include "argList.H"
|
#include "argList.H"
|
||||||
#include "boolList.H"
|
#include "boolList.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "HashSet.H"
|
#include "HashSet.H"
|
||||||
#include "cpuTime.H"
|
#include "cpuTime.H"
|
||||||
#include <vector>
|
#include <vector>
|
||||||
@ -63,7 +63,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
unsigned long sum = 0;
|
unsigned long sum = 0;
|
||||||
|
|
||||||
PackedBoolList packed(n, 1);
|
bitSet packed(n, true);
|
||||||
boolList unpacked(n, true);
|
boolList unpacked(n, true);
|
||||||
|
|
||||||
#ifdef TEST_STD_BOOLLIST
|
#ifdef TEST_STD_BOOLLIST
|
||||||
|
|||||||
@ -1,3 +0,0 @@
|
|||||||
Test-PackedList3.C
|
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList3
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
Test-PackedList4.C
|
|
||||||
|
|
||||||
EXE = $(FOAM_USER_APPBIN)/Test-PackedList4
|
|
||||||
@ -1,168 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Application
|
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "uLabel.H"
|
|
||||||
#include "boolList.H"
|
|
||||||
#include "DynamicList.H"
|
|
||||||
#include "IOstreams.H"
|
|
||||||
#include "PackedBoolList.H"
|
|
||||||
#include "ITstream.H"
|
|
||||||
#include "StringStream.H"
|
|
||||||
#include "FlatOutput.H"
|
|
||||||
|
|
||||||
using namespace Foam;
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
// Main program:
|
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
|
||||||
{
|
|
||||||
PackedBoolList list1(20);
|
|
||||||
// set every third one on
|
|
||||||
forAll(list1, i)
|
|
||||||
{
|
|
||||||
list1[i] = !(i % 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "\nalternating bit pattern\n";
|
|
||||||
list1.printInfo(Info, true);
|
|
||||||
|
|
||||||
PackedBoolList list2(list1);
|
|
||||||
list2.flip();
|
|
||||||
|
|
||||||
Info<< "\nflipped bit pattern\n";
|
|
||||||
list2.printBits(Info);
|
|
||||||
|
|
||||||
// set every other on
|
|
||||||
forAll(list2, i)
|
|
||||||
{
|
|
||||||
list2[i] = !(i % 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "\nalternating bit pattern\n";
|
|
||||||
list2.printBits(Info);
|
|
||||||
|
|
||||||
list2.resize(28, false);
|
|
||||||
list2.resize(34, true);
|
|
||||||
list2.resize(40, false);
|
|
||||||
for (label i=0; i < 4; ++i)
|
|
||||||
{
|
|
||||||
list2[i] = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "\nresized with false, 6 true + 6 false, bottom 4 bits true\n";
|
|
||||||
list2.printInfo(Info, true);
|
|
||||||
|
|
||||||
labelList list2Labels = list2.used();
|
|
||||||
|
|
||||||
PackedBoolList list4
|
|
||||||
(
|
|
||||||
ITstream
|
|
||||||
(
|
|
||||||
"input",
|
|
||||||
"(1 n 1 n 1 n 1 1 off 0 0 f f 0 y yes y true y false on t)"
|
|
||||||
)()
|
|
||||||
);
|
|
||||||
|
|
||||||
Info<< "\ntest Istream constructor\n";
|
|
||||||
|
|
||||||
list4.printInfo(Info, true);
|
|
||||||
Info<< list4 << " indices: " << list4.used() << nl;
|
|
||||||
|
|
||||||
Info<< "\nassign from labelList\n";
|
|
||||||
list4.clear();
|
|
||||||
list4.setMany(labelList{0, 1, 2, 3, 12, 13, 14, 19, 20, 21});
|
|
||||||
|
|
||||||
list4.printInfo(Info, true);
|
|
||||||
Info<< list4 << " indices: " << list4.used() << nl;
|
|
||||||
|
|
||||||
// Not yet:
|
|
||||||
// PackedBoolList list5{0, 1, 2, 3, 12, 13, 14, 19, 20, 21};
|
|
||||||
// list5.printInfo(Info, true);
|
|
||||||
// Info<< list5 << " indices: " << list5.used() << nl;
|
|
||||||
|
|
||||||
Info<< "\nassign from indices\n";
|
|
||||||
list4.read
|
|
||||||
(
|
|
||||||
IStringStream
|
|
||||||
(
|
|
||||||
"{0 1 2 3 12 13 14 19 20 21}"
|
|
||||||
)()
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
list4.printInfo(Info, true);
|
|
||||||
Info<< list4 << " indices: " << list4.used() << nl;
|
|
||||||
|
|
||||||
boolList bools(list4.size());
|
|
||||||
forAll(list4, i)
|
|
||||||
{
|
|
||||||
bools[i] = list4[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
Info<< "boolList: " << bools << nl;
|
|
||||||
|
|
||||||
// check roundabout assignments
|
|
||||||
PackedList<2> pl2
|
|
||||||
(
|
|
||||||
IStringStream
|
|
||||||
(
|
|
||||||
"{(0 3)(1 3)(2 3)(3 3)(12 3)(13 3)(14 3)(19 3)(20 3)(21 3)}"
|
|
||||||
)()
|
|
||||||
);
|
|
||||||
|
|
||||||
Info<< "roundabout assignment: " << pl2 << nl;
|
|
||||||
|
|
||||||
list4.clear();
|
|
||||||
forAll(pl2, i)
|
|
||||||
{
|
|
||||||
list4[i] = pl2[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
list4.writeList(Info, -1) << nl; // indexed output
|
|
||||||
|
|
||||||
list4.writeEntry("PackedBoolList", Info);
|
|
||||||
|
|
||||||
// Construct from labelUList, labelUIndList
|
|
||||||
{
|
|
||||||
DynamicList<label> indices({10, 50, 300});
|
|
||||||
|
|
||||||
Info<< "set: " << flatOutput(indices) << endl;
|
|
||||||
|
|
||||||
PackedBoolList bools1(indices);
|
|
||||||
|
|
||||||
Info<< "used: " << bools1.size() << " "
|
|
||||||
<< flatOutput(bools1.used()) << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -218,7 +218,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
labelList patchEdges;
|
labelList patchEdges;
|
||||||
labelList coupledEdges;
|
labelList coupledEdges;
|
||||||
PackedBoolList sameEdgeOrientation;
|
bitSet sameEdgeOrientation;
|
||||||
PatchTools::matchEdges
|
PatchTools::matchEdges
|
||||||
(
|
(
|
||||||
pp,
|
pp,
|
||||||
|
|||||||
3
applications/test/bitSet1/Make/files
Normal file
3
applications/test/bitSet1/Make/files
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Test-bitSet1.C
|
||||||
|
|
||||||
|
EXE = $(FOAM_USER_APPBIN)/Test-bitSet1
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -22,50 +22,60 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Application
|
Application
|
||||||
|
Test-bitSet1
|
||||||
|
|
||||||
Description
|
Description
|
||||||
|
Test bitSet functionality
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "argList.H"
|
#include "argList.H"
|
||||||
|
#include "boolList.H"
|
||||||
|
#include "bitSet.H"
|
||||||
|
#include "HashSet.H"
|
||||||
#include "cpuTime.H"
|
#include "cpuTime.H"
|
||||||
#include "PackedBoolList.H"
|
#include <vector>
|
||||||
|
#include <unordered_set>
|
||||||
|
|
||||||
using namespace Foam;
|
using namespace Foam;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
inline Ostream& report
|
||||||
|
(
|
||||||
|
const bitSet& bitset,
|
||||||
|
bool showBits = false,
|
||||||
|
bool debugOutput = false
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Info<< "size=" << bitset.size() << "/" << bitset.capacity()
|
||||||
|
<< " count=" << bitset.count()
|
||||||
|
<< " all:" << bitset.all()
|
||||||
|
<< " any:" << bitset.any()
|
||||||
|
<< " none:" << bitset.none() << nl;
|
||||||
|
|
||||||
|
Info<< "values: " << flatOutput(bitset) << nl;
|
||||||
|
if (showBits)
|
||||||
|
{
|
||||||
|
bitset.printBits(Info, debugOutput) << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
// Main program:
|
// Main program:
|
||||||
|
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
const label nLoop = 5;
|
bitSet set1(100);
|
||||||
const label n = 100000000;
|
|
||||||
// const label nReport = 1000000;
|
|
||||||
|
|
||||||
cpuTime timer;
|
Info<<"bitSet(label): "; report(set1, true);
|
||||||
|
|
||||||
// test inserts
|
bitSet set2(100, { -1, 10, 25, 45});
|
||||||
PackedBoolList packed;
|
Info<<"bitSet(label, labels): "; report(set2, true);
|
||||||
for (label iloop = 0; iloop < nLoop; ++iloop)
|
|
||||||
{
|
|
||||||
for (label i = 0; i < n; ++i)
|
|
||||||
{
|
|
||||||
// if ((i % nReport) == 0 && i)
|
|
||||||
// {
|
|
||||||
// Info<< "." << flush;
|
|
||||||
// }
|
|
||||||
packed[i] = 1;
|
|
||||||
// Make compiler do something else too
|
|
||||||
packed[i/2] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Info<< nl
|
|
||||||
<< "insert test: " << nLoop << "*" << n << " elements in "
|
|
||||||
<< timer.cpuTimeIncrement() << " s\n\n";
|
|
||||||
|
|
||||||
Info << "\nEnd\n" << endl;
|
Info<< "End\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
3
applications/test/bitSet2/Make/files
Normal file
3
applications/test/bitSet2/Make/files
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Test-bitSet2.C
|
||||||
|
|
||||||
|
EXE = $(FOAM_USER_APPBIN)/Test-bitSet2
|
||||||
311
applications/test/bitSet2/Test-bitSet2.C
Normal file
311
applications/test/bitSet2/Test-bitSet2.C
Normal file
@ -0,0 +1,311 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Application
|
||||||
|
Test-bitSet2
|
||||||
|
|
||||||
|
Description
|
||||||
|
Test bitSet functionality
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "uLabel.H"
|
||||||
|
#include "boolList.H"
|
||||||
|
#include "DynamicList.H"
|
||||||
|
#include "IOstreams.H"
|
||||||
|
#include "ITstream.H"
|
||||||
|
#include "StringStream.H"
|
||||||
|
#include "bitSet.H"
|
||||||
|
#include "FlatOutput.H"
|
||||||
|
|
||||||
|
using namespace Foam;
|
||||||
|
|
||||||
|
inline Ostream& report
|
||||||
|
(
|
||||||
|
const bitSet& bitset,
|
||||||
|
bool showBits = false,
|
||||||
|
bool debugOutput = false
|
||||||
|
)
|
||||||
|
{
|
||||||
|
Info<< "size=" << bitset.size() << "/" << bitset.capacity()
|
||||||
|
<< " count=" << bitset.count()
|
||||||
|
<< " all:" << bitset.all()
|
||||||
|
<< " any:" << bitset.any()
|
||||||
|
<< " none:" << bitset.none() << nl;
|
||||||
|
|
||||||
|
Info<< "values: " << flatOutput(bitset) << nl;
|
||||||
|
if (showBits)
|
||||||
|
{
|
||||||
|
bitset.printBits(Info, debugOutput) << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Info;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class UIntType>
|
||||||
|
std::string toString(UIntType value, char off='.', char on='1')
|
||||||
|
{
|
||||||
|
std::string str(std::numeric_limits<UIntType>::digits, off);
|
||||||
|
|
||||||
|
unsigned n = 0;
|
||||||
|
|
||||||
|
// Starting from most significant bit - makes for easy reading.
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned test = (1u << (std::numeric_limits<UIntType>::digits-1));
|
||||||
|
test;
|
||||||
|
test >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
str[n++] = ((value & test) ? on : off);
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool compare
|
||||||
|
(
|
||||||
|
const bitSet& bitset,
|
||||||
|
const std::string& expected
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const List<unsigned int>& store = bitset.storage();
|
||||||
|
|
||||||
|
std::string has;
|
||||||
|
|
||||||
|
for (label blocki=0; blocki < bitset.nBlocks(); ++blocki)
|
||||||
|
{
|
||||||
|
has += toString(store[blocki]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (has == expected)
|
||||||
|
{
|
||||||
|
Info<< "pass: " << has << nl;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "fail: " << has << nl;
|
||||||
|
Info<< "expect: " << expected << nl;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
// Main program:
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
bitSet list1(22);
|
||||||
|
// Set every third one on
|
||||||
|
forAll(list1, i)
|
||||||
|
{
|
||||||
|
list1[i] = !(i % 3);
|
||||||
|
}
|
||||||
|
Info<< "\nalternating bit pattern\n";
|
||||||
|
compare(list1, "..........1..1..1..1..1..1..1..1");
|
||||||
|
|
||||||
|
list1.unset(labelRange(13, 20)); // In range
|
||||||
|
|
||||||
|
Info<< "\nafter clear [13,..]\n";
|
||||||
|
compare(list1, "...................1..1..1..1..1");
|
||||||
|
|
||||||
|
report(list1, true);
|
||||||
|
|
||||||
|
list1.unset(labelRange(40, 20)); // out of range
|
||||||
|
Info<< "\nafter clear [40,..]\n";
|
||||||
|
compare(list1, "...................1..1..1..1..1");
|
||||||
|
|
||||||
|
report(list1, true);
|
||||||
|
|
||||||
|
|
||||||
|
Info<< "first: " << list1.find_first()
|
||||||
|
<< " last: " << list1.find_last() << endl;
|
||||||
|
|
||||||
|
Info<< "iterate through:";
|
||||||
|
for (const label idx : list1)
|
||||||
|
{
|
||||||
|
Info<<" " << idx;
|
||||||
|
}
|
||||||
|
Info<< nl;
|
||||||
|
|
||||||
|
Info<< "\nalternating bit pattern\n";
|
||||||
|
report(list1, true);
|
||||||
|
|
||||||
|
bitSet list2 = ~list1;
|
||||||
|
|
||||||
|
Info<< "\nflipped bit pattern\n";
|
||||||
|
report(list2, true);
|
||||||
|
|
||||||
|
// set every other on
|
||||||
|
forAll(list2, i)
|
||||||
|
{
|
||||||
|
list2[i] = !(i % 2);
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "\nstarting pattern\n";
|
||||||
|
report(list2, true);
|
||||||
|
|
||||||
|
list2.resize(28, false);
|
||||||
|
list2.resize(34, true);
|
||||||
|
list2.resize(40, false);
|
||||||
|
for (label i=0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
list2[i] = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "\nresized with false, [28,34) true + 6 false, bottom 4 bits true\n";
|
||||||
|
|
||||||
|
compare
|
||||||
|
(
|
||||||
|
list2,
|
||||||
|
"1111.......1.1.1.1.1.1.1.1.11111"
|
||||||
|
"..............................11"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
report(list2, true);
|
||||||
|
|
||||||
|
labelList list2Labels = list2.toc();
|
||||||
|
|
||||||
|
Info<< "\noperator|\n";
|
||||||
|
|
||||||
|
list1.printBits(Info);
|
||||||
|
list2.printBits(Info);
|
||||||
|
Info<< "==\n";
|
||||||
|
(list1 | list2).printBits(Info);
|
||||||
|
|
||||||
|
Info<< "\noperator& : does trim\n";
|
||||||
|
report((list1 & list2), true);
|
||||||
|
|
||||||
|
Info<< "\noperator^\n";
|
||||||
|
report((list1 ^ list2), true);
|
||||||
|
|
||||||
|
Info<< "\noperator|=\n";
|
||||||
|
{
|
||||||
|
bitSet list3 = list1;
|
||||||
|
report((list3 |= list2), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "\noperator&=\n";
|
||||||
|
{
|
||||||
|
bitSet list3 = list1;
|
||||||
|
report((list3 &= list2), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "\noperator^=\n";
|
||||||
|
{
|
||||||
|
bitSet list3 = list1;
|
||||||
|
report((list3 ^= list2), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
Info<< "\noperator-=\n";
|
||||||
|
{
|
||||||
|
bitSet list3 = list1;
|
||||||
|
report((list3 -= list2), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
bitSet list4
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
"input",
|
||||||
|
"(1 n 1 n 1 n 1 1 off 0 0 f f 0 y yes y true y false on t)"
|
||||||
|
)()
|
||||||
|
);
|
||||||
|
|
||||||
|
Info<< "\ntest Istream constructor\n";
|
||||||
|
|
||||||
|
report(list4, true);
|
||||||
|
|
||||||
|
Info<< "\nclear/assign from labelList\n";
|
||||||
|
list4.clear();
|
||||||
|
list4.setMany(labelList{0, 1, 2, 3, 12, 13, 14, 19, 20, 21});
|
||||||
|
|
||||||
|
report(list4, true);
|
||||||
|
|
||||||
|
// Not yet:
|
||||||
|
// bitSet list5{0, 1, 2, 3, 12, 13, 14, 19, 20, 21};
|
||||||
|
// list5.printInfo(Info, true);
|
||||||
|
// Info<< list5 << " indices: " << list5.toc() << nl;
|
||||||
|
|
||||||
|
Info<< "\nassign from indices\n";
|
||||||
|
list4.read
|
||||||
|
(
|
||||||
|
IStringStream
|
||||||
|
(
|
||||||
|
"{0 1 2 3 12 13 14 19 20 21}"
|
||||||
|
)()
|
||||||
|
);
|
||||||
|
|
||||||
|
report(list4, true);
|
||||||
|
compare(list4, "..........111....111........1111");
|
||||||
|
|
||||||
|
list4.set(labelRange(28, 6)); // extends size
|
||||||
|
|
||||||
|
Info<<"extended\n";
|
||||||
|
compare
|
||||||
|
(
|
||||||
|
list4,
|
||||||
|
"1111......111....111........1111"
|
||||||
|
"..............................11"
|
||||||
|
);
|
||||||
|
|
||||||
|
list4.set(labelRange(40, 6)); // extends size
|
||||||
|
Info<<"extended\n";
|
||||||
|
compare
|
||||||
|
(
|
||||||
|
list4,
|
||||||
|
"1111......111....111........1111"
|
||||||
|
"..................111111......11"
|
||||||
|
);
|
||||||
|
|
||||||
|
list4.unset(labelRange(14, 19));
|
||||||
|
Info<<"cleared [14,33)\n";
|
||||||
|
compare
|
||||||
|
(
|
||||||
|
list4,
|
||||||
|
"..................11........1111"
|
||||||
|
"..................111111......1."
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
// Construct from labelUList, labelUIndList
|
||||||
|
{
|
||||||
|
DynamicList<label> indices({10, 50, 300});
|
||||||
|
|
||||||
|
Info<< "set: " << flatOutput(indices) << endl;
|
||||||
|
|
||||||
|
bitSet bools1(indices);
|
||||||
|
|
||||||
|
Info<< "used: " << bools1.size() << " "
|
||||||
|
<< flatOutput(bools1.toc()) << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -27,6 +27,7 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "bool.H"
|
#include "bool.H"
|
||||||
|
#include "BitOps.H"
|
||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "stdFoam.H"
|
#include "stdFoam.H"
|
||||||
|
|
||||||
@ -177,6 +178,15 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
printOffset<double>();
|
printOffset<double>();
|
||||||
|
|
||||||
|
|
||||||
|
Info<<nl << "Test repeat_value" << nl << nl;
|
||||||
|
|
||||||
|
Info<< BitOps::bitInfo<unsigned>(BitOps::repeat_value<unsigned, 3>(1u))
|
||||||
|
<< nl;
|
||||||
|
|
||||||
|
Info<< BitOps::bitInfo<unsigned>(BitOps::repeat_value<unsigned>(1u))
|
||||||
|
<< nl;
|
||||||
|
|
||||||
Info << "---\nEnd\n" << endl;
|
Info << "---\nEnd\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
3
applications/test/limits/Make/files
Normal file
3
applications/test/limits/Make/files
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Test-limits.C
|
||||||
|
|
||||||
|
EXE = $(FOAM_USER_APPBIN)/Test-limits
|
||||||
2
applications/test/limits/Make/options
Normal file
2
applications/test/limits/Make/options
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
/* EXE_INC = */
|
||||||
|
/* EXE_LIBS = */
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -22,44 +22,24 @@ License
|
|||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Description
|
Description
|
||||||
Test the sizeof for basic types. Can be compiled and run without
|
Test the sizeof for basic types.
|
||||||
any OpenFOAM libraries.
|
Can be compiled and run without any OpenFOAM libraries.
|
||||||
|
|
||||||
|
g++ -std=c++11 -oTest-machine-sizes Test-machine-sizes.cpp
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <climits>
|
#include <climits>
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <limits>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
|
|
||||||
// Can also compile without OpenFOAM
|
|
||||||
#ifdef WM_LABEL_SIZE
|
|
||||||
#include "IOstreams.H"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
void print(const char* msg)
|
void print(const char* msg)
|
||||||
{
|
{
|
||||||
std::cout<< msg << ' ' << sizeof(T) << '\n';
|
std::cout<< msg << ' ' << sizeof(T) << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef WM_LABEL_SIZE
|
|
||||||
template<class T>
|
|
||||||
void printMax(const char* msg)
|
|
||||||
{
|
|
||||||
std::cout<< msg << ' ' << sizeof(T)
|
|
||||||
<< " max "
|
|
||||||
<< std::numeric_limits<T>::max() << '\n';
|
|
||||||
|
|
||||||
Foam::Info<< msg << ' ' << sizeof(T)
|
|
||||||
<< " max "
|
|
||||||
<< long(std::numeric_limits<T>::max()) << '\n';
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
// Main program:
|
// Main program:
|
||||||
|
|
||||||
@ -67,42 +47,16 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
std::cout<<"machine sizes\n---\n\n";
|
std::cout<<"machine sizes\n---\n\n";
|
||||||
|
|
||||||
print<mode_t>("mode_t");
|
|
||||||
print<short>("short");
|
print<short>("short");
|
||||||
print<int>("int");
|
print<int>("int");
|
||||||
print<long>("long");
|
print<long>("long");
|
||||||
print<long long>("long long");
|
print<long long>("long long");
|
||||||
print<unsigned short>("ushort");
|
|
||||||
print<unsigned int>("uint");
|
|
||||||
print<unsigned long>("ulong");
|
|
||||||
print<unsigned long long>("ulong-long");
|
|
||||||
print<int16_t>("int16");
|
|
||||||
print<int32_t>("int32");
|
|
||||||
print<int64_t>("int64");
|
|
||||||
print<uint16_t>("uint16");
|
|
||||||
print<uint32_t>("uint32");
|
|
||||||
print<uint64_t>("uint64");
|
|
||||||
print<float>("float");
|
print<float>("float");
|
||||||
print<double>("double");
|
print<double>("double");
|
||||||
|
print<long double>("long double");
|
||||||
print<std::string>("std::string");
|
print<std::string>("std::string");
|
||||||
print<std::string::size_type>("std::string::size_type");
|
print<std::string::size_type>("std::string::size_type");
|
||||||
|
|
||||||
#ifdef WM_LABEL_SIZE
|
|
||||||
std::cout<<"\nmax values\n---\n\n";
|
|
||||||
|
|
||||||
printMax<mode_t>("mode_t");
|
|
||||||
Foam::Info<< "mode_t 0777: " << mode_t(0777) << '\n';
|
|
||||||
|
|
||||||
printMax<short>("short");
|
|
||||||
printMax<int>("int");
|
|
||||||
printMax<long>("long");
|
|
||||||
printMax<unsigned short>("ushort");
|
|
||||||
printMax<unsigned int>("uint");
|
|
||||||
printMax<unsigned long>("ulong");
|
|
||||||
printMax<float>("float");
|
|
||||||
printMax<double>("double");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
std::cout << "\n---\nEnd\n\n";
|
std::cout << "\n---\nEnd\n\n";
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@ -48,10 +48,6 @@ Usage
|
|||||||
|
|
||||||
- \par -triSurface
|
- \par -triSurface
|
||||||
Use triSurface library for input/output
|
Use triSurface library for input/output
|
||||||
|
|
||||||
- \par -keyed
|
|
||||||
Use keyedSurface for input/output
|
|
||||||
|
|
||||||
Note
|
Note
|
||||||
The filename extensions are used to determine the file format type.
|
The filename extensions are used to determine the file format type.
|
||||||
|
|
||||||
@ -64,7 +60,6 @@ Note
|
|||||||
#include "surfMesh.H"
|
#include "surfMesh.H"
|
||||||
#include "surfFields.H"
|
#include "surfFields.H"
|
||||||
#include "surfPointFields.H"
|
#include "surfPointFields.H"
|
||||||
#include "PackedBoolList.H"
|
|
||||||
|
|
||||||
#include "MeshedSurfaces.H"
|
#include "MeshedSurfaces.H"
|
||||||
#include "ModifiableMeshedSurface.H"
|
#include "ModifiableMeshedSurface.H"
|
||||||
|
|||||||
@ -406,13 +406,13 @@ void testPointSync(const polyMesh& mesh, Random& rndGen)
|
|||||||
{
|
{
|
||||||
labelList nMasters(mesh.nPoints(), 0);
|
labelList nMasters(mesh.nPoints(), 0);
|
||||||
|
|
||||||
PackedBoolList isMasterPoint(syncTools::getMasterPoints(mesh));
|
bitSet isMasterPoint(syncTools::getMasterPoints(mesh));
|
||||||
|
|
||||||
forAll(isMasterPoint, pointi)
|
forAll(isMasterPoint, pointi)
|
||||||
{
|
{
|
||||||
if (isMasterPoint[pointi])
|
if (isMasterPoint.test(pointi))
|
||||||
{
|
{
|
||||||
nMasters[pointi] = 1;
|
nMasters.set(pointi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -482,13 +482,13 @@ void testEdgeSync(const polyMesh& mesh, Random& rndGen)
|
|||||||
{
|
{
|
||||||
labelList nMasters(edges.size(), 0);
|
labelList nMasters(edges.size(), 0);
|
||||||
|
|
||||||
PackedBoolList isMasterEdge(syncTools::getMasterEdges(mesh));
|
bitSet isMasterEdge(syncTools::getMasterEdges(mesh));
|
||||||
|
|
||||||
forAll(isMasterEdge, edgeI)
|
forAll(isMasterEdge, edgeI)
|
||||||
{
|
{
|
||||||
if (isMasterEdge[edgeI])
|
if (isMasterEdge.test(edgeI))
|
||||||
{
|
{
|
||||||
nMasters[edgeI] = 1;
|
nMasters.set(edgeI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -551,13 +551,13 @@ void testFaceSync(const polyMesh& mesh, Random& rndGen)
|
|||||||
{
|
{
|
||||||
labelList nMasters(mesh.nFaces(), 0);
|
labelList nMasters(mesh.nFaces(), 0);
|
||||||
|
|
||||||
PackedBoolList isMasterFace(syncTools::getMasterFaces(mesh));
|
Bitset isMasterFace(syncTools::getMasterFaces(mesh));
|
||||||
|
|
||||||
forAll(isMasterFace, facei)
|
forAll(isMasterFace, facei)
|
||||||
{
|
{
|
||||||
if (isMasterFace[facei])
|
if (isMasterFace.test(facei))
|
||||||
{
|
{
|
||||||
nMasters[facei] = 1;
|
nMasters.set(facei);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -81,7 +81,7 @@ void modifyOrAddFace
|
|||||||
const label zoneID,
|
const label zoneID,
|
||||||
const bool zoneFlip,
|
const bool zoneFlip,
|
||||||
|
|
||||||
PackedBoolList& modifiedFace
|
bitSet& modifiedFace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (modifiedFace.set(facei))
|
if (modifiedFace.set(facei))
|
||||||
@ -338,7 +338,7 @@ void subsetTopoSets
|
|||||||
Info<< "Subsetting " << set.type() << " " << set.name() << endl;
|
Info<< "Subsetting " << set.type() << " " << set.name() << endl;
|
||||||
|
|
||||||
// Map the data
|
// Map the data
|
||||||
PackedBoolList isSet(set.maxSize(mesh));
|
bitSet isSet(set.maxSize(mesh));
|
||||||
forAllConstIter(labelHashSet, set, iter)
|
forAllConstIter(labelHashSet, set, iter)
|
||||||
{
|
{
|
||||||
isSet.set(iter.key());
|
isSet.set(iter.key());
|
||||||
@ -374,7 +374,7 @@ void createCoupledBaffles
|
|||||||
fvMesh& mesh,
|
fvMesh& mesh,
|
||||||
const labelList& coupledWantedPatch,
|
const labelList& coupledWantedPatch,
|
||||||
polyTopoChange& meshMod,
|
polyTopoChange& meshMod,
|
||||||
PackedBoolList& modifiedFace
|
bitSet& modifiedFace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const faceZoneMesh& faceZones = mesh.faceZones();
|
const faceZoneMesh& faceZones = mesh.faceZones();
|
||||||
@ -442,7 +442,7 @@ void createCyclicCoupledBaffles
|
|||||||
const labelList& cyclicMasterPatch,
|
const labelList& cyclicMasterPatch,
|
||||||
const labelList& cyclicSlavePatch,
|
const labelList& cyclicSlavePatch,
|
||||||
polyTopoChange& meshMod,
|
polyTopoChange& meshMod,
|
||||||
PackedBoolList& modifiedFace
|
bitSet& modifiedFace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const faceZoneMesh& faceZones = mesh.faceZones();
|
const faceZoneMesh& faceZones = mesh.faceZones();
|
||||||
@ -1119,7 +1119,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
// Whether first use of face (modify) or consecutive (add)
|
// Whether first use of face (modify) or consecutive (add)
|
||||||
PackedBoolList modifiedFace(mesh.nFaces());
|
bitSet modifiedFace(mesh.nFaces());
|
||||||
|
|
||||||
// Create coupled wall-side baffles
|
// Create coupled wall-side baffles
|
||||||
createCoupledBaffles
|
createCoupledBaffles
|
||||||
|
|||||||
@ -366,7 +366,7 @@ void Foam::cellSplitter::setRefinement
|
|||||||
|
|
||||||
|
|
||||||
// Mark off affected face.
|
// Mark off affected face.
|
||||||
boolList faceUpToDate(mesh_.nFaces(), true);
|
bitSet faceUpToDate(mesh_.nFaces(), true);
|
||||||
|
|
||||||
forAllConstIter(Map<point>, cellToMidPoint, iter)
|
forAllConstIter(Map<point>, cellToMidPoint, iter)
|
||||||
{
|
{
|
||||||
@ -374,18 +374,15 @@ void Foam::cellSplitter::setRefinement
|
|||||||
|
|
||||||
const cell& cFaces = mesh_.cells()[celli];
|
const cell& cFaces = mesh_.cells()[celli];
|
||||||
|
|
||||||
forAll(cFaces, i)
|
faceUpToDate.unsetMany(cFaces);
|
||||||
{
|
|
||||||
label facei = cFaces[i];
|
|
||||||
|
|
||||||
faceUpToDate[facei] = false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
forAll(faceUpToDate, facei)
|
forAll(faceUpToDate, facei)
|
||||||
{
|
{
|
||||||
if (!faceUpToDate[facei])
|
if (!faceUpToDate.test(facei))
|
||||||
{
|
{
|
||||||
|
faceUpToDate.set(facei);
|
||||||
|
|
||||||
const face& f = mesh_.faces()[facei];
|
const face& f = mesh_.faces()[facei];
|
||||||
|
|
||||||
if (mesh_.isInternalFace(facei))
|
if (mesh_.isInternalFace(facei))
|
||||||
@ -454,8 +451,6 @@ void Foam::cellSplitter::setRefinement
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
faceUpToDate[facei] = true;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -579,7 +579,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
pointField newPoints(points);
|
pointField newPoints(points);
|
||||||
|
|
||||||
PackedBoolList collapseEdge(mesh.nEdges());
|
bitSet collapseEdge(mesh.nEdges());
|
||||||
Map<point> collapsePointToLocation(mesh.nPoints());
|
Map<point> collapsePointToLocation(mesh.nPoints());
|
||||||
|
|
||||||
// Get new positions and construct collapse network
|
// Get new positions and construct collapse network
|
||||||
|
|||||||
@ -3,7 +3,7 @@
|
|||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
\\/ M anipulation | Copyright (C) 2016-2017 OpenCFD Ltd.
|
\\/ M anipulation | Copyright (C) 2016-2018 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -97,10 +97,10 @@ int main(int argc, char *argv[])
|
|||||||
label nPatchFaces = 0;
|
label nPatchFaces = 0;
|
||||||
label nPatchEdges = 0;
|
label nPatchEdges = 0;
|
||||||
|
|
||||||
forAllConstIter(labelHashSet, patchSet, iter)
|
for (const label patchi : patchSet)
|
||||||
{
|
{
|
||||||
nPatchFaces += mesh.boundaryMesh()[iter.key()].size();
|
nPatchFaces += mesh.boundaryMesh()[patchi].size();
|
||||||
nPatchEdges += mesh.boundaryMesh()[iter.key()].nEdges();
|
nPatchEdges += mesh.boundaryMesh()[patchi].nEdges();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Construct from estimate for the number of cells to refine
|
// Construct from estimate for the number of cells to refine
|
||||||
@ -111,15 +111,13 @@ int main(int argc, char *argv[])
|
|||||||
DynamicList<scalar> allCutEdgeWeights(nPatchEdges);
|
DynamicList<scalar> allCutEdgeWeights(nPatchEdges);
|
||||||
|
|
||||||
// Find cells to refine
|
// Find cells to refine
|
||||||
forAllConstIter(labelHashSet, patchSet, iter)
|
for (const label patchi : patchSet)
|
||||||
{
|
{
|
||||||
const polyPatch& pp = mesh.boundaryMesh()[iter.key()];
|
const polyPatch& pp = mesh.boundaryMesh()[patchi];
|
||||||
const labelList& meshPoints = pp.meshPoints();
|
const labelList& meshPoints = pp.meshPoints();
|
||||||
|
|
||||||
forAll(meshPoints, pointi)
|
for (const label meshPointi : meshPoints)
|
||||||
{
|
{
|
||||||
label meshPointi = meshPoints[pointi];
|
|
||||||
|
|
||||||
const labelList& pCells = mesh.pointCells()[meshPointi];
|
const labelList& pCells = mesh.pointCells()[meshPointi];
|
||||||
|
|
||||||
cutCells.insertMany(pCells);
|
cutCells.insertMany(pCells);
|
||||||
@ -139,49 +137,43 @@ int main(int argc, char *argv[])
|
|||||||
<< cells.instance()/cells.local()/cells.name()
|
<< cells.instance()/cells.local()/cells.name()
|
||||||
<< nl << endl;
|
<< nl << endl;
|
||||||
|
|
||||||
forAllConstIter(cellSet, cells, iter)
|
for (const label celli : cells)
|
||||||
{
|
{
|
||||||
cutCells.erase(iter.key());
|
cutCells.erase(celli);
|
||||||
}
|
}
|
||||||
Info<< "Removed from cells to cut all the ones not in set "
|
Info<< "Removed from cells to cut all the ones not in set "
|
||||||
<< setName << nl << endl;
|
<< setName << nl << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mark all mesh points on patch
|
// Mark all mesh points on patch
|
||||||
boolList vertOnPatch(mesh.nPoints(), false);
|
bitSet vertOnPatch(mesh.nPoints());
|
||||||
|
|
||||||
forAllConstIter(labelHashSet, patchSet, iter)
|
for (const label patchi : patchSet)
|
||||||
{
|
{
|
||||||
const polyPatch& pp = mesh.boundaryMesh()[iter.key()];
|
const polyPatch& pp = mesh.boundaryMesh()[patchi];
|
||||||
const labelList& meshPoints = pp.meshPoints();
|
const labelList& meshPoints = pp.meshPoints();
|
||||||
|
|
||||||
forAll(meshPoints, pointi)
|
vertOnPatch.setMany(meshPoints);
|
||||||
{
|
|
||||||
vertOnPatch[meshPoints[pointi]] = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
forAllConstIter(labelHashSet, patchSet, iter)
|
for (const label patchi : patchSet)
|
||||||
{
|
{
|
||||||
const polyPatch& pp = mesh.boundaryMesh()[iter.key()];
|
const polyPatch& pp = mesh.boundaryMesh()[patchi];
|
||||||
const labelList& meshPoints = pp.meshPoints();
|
const labelList& meshPoints = pp.meshPoints();
|
||||||
|
|
||||||
forAll(meshPoints, pointi)
|
for (const label meshPointi : meshPoints)
|
||||||
{
|
{
|
||||||
label meshPointi = meshPoints[pointi];
|
|
||||||
|
|
||||||
const labelList& pEdges = mesh.pointEdges()[meshPointi];
|
const labelList& pEdges = mesh.pointEdges()[meshPointi];
|
||||||
|
|
||||||
forAll(pEdges, pEdgeI)
|
for (const label edgei : pEdges)
|
||||||
{
|
{
|
||||||
const label edgeI = pEdges[pEdgeI];
|
const edge& e = mesh.edges()[edgei];
|
||||||
const edge& e = mesh.edges()[edgeI];
|
|
||||||
|
|
||||||
label otherPointi = e.otherVertex(meshPointi);
|
label otherPointi = e.otherVertex(meshPointi);
|
||||||
|
|
||||||
if (!vertOnPatch[otherPointi])
|
if (!vertOnPatch.test(otherPointi))
|
||||||
{
|
{
|
||||||
allCutEdges.append(edgeI);
|
allCutEdges.append(edgei);
|
||||||
|
|
||||||
if (e.start() == meshPointi)
|
if (e.start() == meshPointi)
|
||||||
{
|
{
|
||||||
@ -214,7 +206,7 @@ int main(int argc, char *argv[])
|
|||||||
(
|
(
|
||||||
mesh,
|
mesh,
|
||||||
cutCells.toc(), // cells candidate for cutting
|
cutCells.toc(), // cells candidate for cutting
|
||||||
labelList(0), // cut vertices
|
labelList(), // cut vertices
|
||||||
allCutEdges, // cut edges
|
allCutEdges, // cut edges
|
||||||
cutEdgeWeights // weight on cut edges
|
cutEdgeWeights // weight on cut edges
|
||||||
);
|
);
|
||||||
|
|||||||
@ -869,7 +869,7 @@ int main(int argc, char *argv[])
|
|||||||
// Pre-filtering: flip "owner" boundary or wrong oriented internal
|
// Pre-filtering: flip "owner" boundary or wrong oriented internal
|
||||||
// faces and move to neighbour
|
// faces and move to neighbour
|
||||||
|
|
||||||
boolList fm(faces.size(), false);
|
bitSet fm(faces.size(), false);
|
||||||
forAll(faces, facei)
|
forAll(faces, facei)
|
||||||
{
|
{
|
||||||
if
|
if
|
||||||
@ -878,7 +878,7 @@ int main(int argc, char *argv[])
|
|||||||
|| (neighbour[facei] != -1 && owner[facei] > neighbour[facei])
|
|| (neighbour[facei] != -1 && owner[facei] > neighbour[facei])
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
fm[facei] = true;
|
fm.set(facei);
|
||||||
if (!cubitFile)
|
if (!cubitFile)
|
||||||
{
|
{
|
||||||
faces[facei].flip();
|
faces[facei].flip();
|
||||||
@ -1279,7 +1279,7 @@ int main(int argc, char *argv[])
|
|||||||
false, // flipFaceFlux
|
false, // flipFaceFlux
|
||||||
-1, // patchID
|
-1, // patchID
|
||||||
faceZonei, // zoneID
|
faceZonei, // zoneID
|
||||||
fm[facei] // zoneFlip
|
fm.test(facei) // zoneFlip
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -1620,14 +1620,14 @@ int main(int argc, char *argv[])
|
|||||||
labelList cls(end() - start() + 1);
|
labelList cls(end() - start() + 1);
|
||||||
|
|
||||||
// Mark zone cells, used for finding faces
|
// Mark zone cells, used for finding faces
|
||||||
boolList zoneCell(pShapeMesh.nCells(), false);
|
bitSet zoneCell(pShapeMesh.nCells(), false);
|
||||||
|
|
||||||
// shift cell indizes by 1
|
// shift cell indizes by 1
|
||||||
label nr=0;
|
label nr=0;
|
||||||
for (label celli = (start() - 1); celli < end(); celli++)
|
for (label celli = (start() - 1); celli < end(); celli++)
|
||||||
{
|
{
|
||||||
cls[nr]=celli;
|
cls[nr]=celli;
|
||||||
zoneCell[celli] = true;
|
zoneCell.set(celli);
|
||||||
nr++;
|
nr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1646,7 +1646,7 @@ int main(int argc, char *argv[])
|
|||||||
label own = pShapeMesh.faceOwner()[facei];
|
label own = pShapeMesh.faceOwner()[facei];
|
||||||
if (nei != -1)
|
if (nei != -1)
|
||||||
{
|
{
|
||||||
if (zoneCell[nei] && zoneCell[own])
|
if (zoneCell.test(nei) && zoneCell.test(own))
|
||||||
{
|
{
|
||||||
zoneFaces.append(facei);
|
zoneFaces.append(facei);
|
||||||
}
|
}
|
||||||
@ -1669,7 +1669,7 @@ int main(int argc, char *argv[])
|
|||||||
const labelList& faceCells = bPatches[pI].faceCells();
|
const labelList& faceCells = bPatches[pI].faceCells();
|
||||||
forAll(faceCells, fcI)
|
forAll(faceCells, fcI)
|
||||||
{
|
{
|
||||||
if (zoneCell[faceCells[fcI] ])
|
if (zoneCell.test(faceCells[fcI]))
|
||||||
{
|
{
|
||||||
boundaryZones[pI].append(name);
|
boundaryZones[pI].append(name);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -890,7 +890,7 @@ int main(int argc, char *argv[])
|
|||||||
const edgeList& edges = mesh.edges();
|
const edgeList& edges = mesh.edges();
|
||||||
const pointField& points = mesh.points();
|
const pointField& points = mesh.points();
|
||||||
|
|
||||||
PackedBoolList collapseEdge(mesh.nEdges());
|
bitSet collapseEdge(mesh.nEdges());
|
||||||
Map<point> collapsePointToLocation(mesh.nPoints());
|
Map<point> collapsePointToLocation(mesh.nPoints());
|
||||||
|
|
||||||
forAll(edges, edgeI)
|
forAll(edges, edgeI)
|
||||||
|
|||||||
@ -1268,7 +1268,7 @@ void extrudeGeometricProperties
|
|||||||
// Determine edge normals on original patch
|
// Determine edge normals on original patch
|
||||||
labelList patchEdges;
|
labelList patchEdges;
|
||||||
labelList coupledEdges;
|
labelList coupledEdges;
|
||||||
PackedBoolList sameEdgeOrientation;
|
bitSet sameEdgeOrientation;
|
||||||
PatchTools::matchEdges
|
PatchTools::matchEdges
|
||||||
(
|
(
|
||||||
extrudePatch,
|
extrudePatch,
|
||||||
@ -2160,7 +2160,7 @@ int main(int argc, char *argv[])
|
|||||||
labelListList extrudeEdgePatches(extrudePatch.nEdges());
|
labelListList extrudeEdgePatches(extrudePatch.nEdges());
|
||||||
|
|
||||||
// Is edge a non-manifold edge
|
// Is edge a non-manifold edge
|
||||||
PackedBoolList nonManifoldEdge(extrudePatch.nEdges());
|
bitSet nonManifoldEdge(extrudePatch.nEdges());
|
||||||
|
|
||||||
// Note: logic has to be same as in countExtrudePatches.
|
// Note: logic has to be same as in countExtrudePatches.
|
||||||
forAll(edgeFaces, edgeI)
|
forAll(edgeFaces, edgeI)
|
||||||
|
|||||||
@ -256,7 +256,7 @@ int main(int argc, char *argv[])
|
|||||||
const boundBox& bb = mesh().bounds();
|
const boundBox& bb = mesh().bounds();
|
||||||
const scalar mergeDim = 1e-4 * bb.minDim();
|
const scalar mergeDim = 1e-4 * bb.minDim();
|
||||||
|
|
||||||
PackedBoolList collapseEdge(mesh().nEdges());
|
bitSet collapseEdge(mesh().nEdges());
|
||||||
Map<point> collapsePointToLocation(mesh().nPoints());
|
Map<point> collapsePointToLocation(mesh().nPoints());
|
||||||
|
|
||||||
forAll(edges, edgeI)
|
forAll(edges, edgeI)
|
||||||
|
|||||||
@ -321,7 +321,7 @@ void Foam::controlMeshRefinement::initialMeshPopulation
|
|||||||
sizes.clear();
|
sizes.clear();
|
||||||
alignments.clear();
|
alignments.clear();
|
||||||
|
|
||||||
PackedBoolList keepVertex(vertices.size(), true);
|
bitSet keepVertex(vertices.size(), true);
|
||||||
|
|
||||||
forAll(vertices, vI)
|
forAll(vertices, vI)
|
||||||
{
|
{
|
||||||
@ -496,7 +496,7 @@ void Foam::controlMeshRefinement::initialMeshPopulation
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
PackedBoolList keepVertex(vertices.size(), true);
|
bitSet keepVertex(vertices.size(), true);
|
||||||
|
|
||||||
forAll(vertices, vI)
|
forAll(vertices, vI)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -1081,7 +1081,7 @@ void Foam::conformalVoronoiMesh::move()
|
|||||||
Zero
|
Zero
|
||||||
);
|
);
|
||||||
|
|
||||||
PackedBoolList pointToBeRetained(number_of_vertices(), true);
|
bitSet pointToBeRetained(number_of_vertices(), true);
|
||||||
|
|
||||||
DynamicList<Point> pointsToInsert(number_of_vertices());
|
DynamicList<Point> pointsToInsert(number_of_vertices());
|
||||||
|
|
||||||
|
|||||||
@ -47,7 +47,7 @@ SourceFiles
|
|||||||
#include "cellShapeControl.H"
|
#include "cellShapeControl.H"
|
||||||
#include "cvControls.H"
|
#include "cvControls.H"
|
||||||
#include "DynamicList.H"
|
#include "DynamicList.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "Time.H"
|
#include "Time.H"
|
||||||
#include "polyMesh.H"
|
#include "polyMesh.H"
|
||||||
#include "plane.H"
|
#include "plane.H"
|
||||||
@ -606,7 +606,7 @@ private:
|
|||||||
pointField& cellCentres,
|
pointField& cellCentres,
|
||||||
labelList& cellToDelaunayVertex,
|
labelList& cellToDelaunayVertex,
|
||||||
labelListList& patchToDelaunayVertex,
|
labelListList& patchToDelaunayVertex,
|
||||||
PackedBoolList& boundaryFacesToRemove
|
bitSet& boundaryFacesToRemove
|
||||||
);
|
);
|
||||||
|
|
||||||
void calcNeighbourCellCentres
|
void calcNeighbourCellCentres
|
||||||
@ -760,7 +760,7 @@ private:
|
|||||||
wordList& patchNames,
|
wordList& patchNames,
|
||||||
PtrList<dictionary>& patchDicts,
|
PtrList<dictionary>& patchDicts,
|
||||||
labelListList& patchPointPairSlaves,
|
labelListList& patchPointPairSlaves,
|
||||||
PackedBoolList& boundaryFacesToRemove,
|
bitSet& boundaryFacesToRemove,
|
||||||
bool includeEmptyPatches = false
|
bool includeEmptyPatches = false
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
@ -791,7 +791,7 @@ private:
|
|||||||
faceList& faces,
|
faceList& faces,
|
||||||
labelList& owner,
|
labelList& owner,
|
||||||
PtrList<dictionary>& patchDicts,
|
PtrList<dictionary>& patchDicts,
|
||||||
PackedBoolList& boundaryFacesToRemove,
|
bitSet& boundaryFacesToRemove,
|
||||||
const List<DynamicList<face>>& patchFaces,
|
const List<DynamicList<face>>& patchFaces,
|
||||||
const List<DynamicList<label>>& patchOwners,
|
const List<DynamicList<label>>& patchOwners,
|
||||||
const List<DynamicList<bool>>& indirectPatchFace
|
const List<DynamicList<bool>>& indirectPatchFace
|
||||||
@ -997,7 +997,7 @@ public:
|
|||||||
const wordList& patchNames,
|
const wordList& patchNames,
|
||||||
const PtrList<dictionary>& patchDicts,
|
const PtrList<dictionary>& patchDicts,
|
||||||
const pointField& cellCentres,
|
const pointField& cellCentres,
|
||||||
PackedBoolList& boundaryFacesToRemove
|
bitSet& boundaryFacesToRemove
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Calculate and write a field of the target cell size,
|
//- Calculate and write a field of the target cell size,
|
||||||
|
|||||||
@ -47,7 +47,7 @@ void Foam::conformalVoronoiMesh::calcDualMesh
|
|||||||
pointField& cellCentres,
|
pointField& cellCentres,
|
||||||
labelList& cellToDelaunayVertex,
|
labelList& cellToDelaunayVertex,
|
||||||
labelListList& patchToDelaunayVertex,
|
labelListList& patchToDelaunayVertex,
|
||||||
PackedBoolList& boundaryFacesToRemove
|
bitSet& boundaryFacesToRemove
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
timeCheck("Start calcDualMesh");
|
timeCheck("Start calcDualMesh");
|
||||||
@ -277,7 +277,7 @@ void Foam::conformalVoronoiMesh::calcTetMesh
|
|||||||
|
|
||||||
sortFaces(faces, owner, neighbour);
|
sortFaces(faces, owner, neighbour);
|
||||||
|
|
||||||
// PackedBoolList boundaryFacesToRemove;
|
// bitSet boundaryFacesToRemove;
|
||||||
// List<DynamicList<bool>> indirectPatchFace;
|
// List<DynamicList<bool>> indirectPatchFace;
|
||||||
//
|
//
|
||||||
// addPatches
|
// addPatches
|
||||||
@ -703,7 +703,7 @@ Foam::conformalVoronoiMesh::createPolyMeshFromPoints
|
|||||||
PtrList<dictionary> patchDicts;
|
PtrList<dictionary> patchDicts;
|
||||||
pointField cellCentres;
|
pointField cellCentres;
|
||||||
labelListList patchToDelaunayVertex;
|
labelListList patchToDelaunayVertex;
|
||||||
PackedBoolList boundaryFacesToRemove;
|
bitSet boundaryFacesToRemove;
|
||||||
|
|
||||||
timeCheck("Start of checkPolyMeshQuality");
|
timeCheck("Start of checkPolyMeshQuality");
|
||||||
|
|
||||||
@ -1103,7 +1103,7 @@ Foam::labelHashSet Foam::conformalVoronoiMesh::checkPolyMeshQuality
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
PackedBoolList ptToBeLimited(pts.size(), false);
|
bitSet ptToBeLimited(pts.size(), false);
|
||||||
|
|
||||||
forAllConstIter(labelHashSet, wrongFaces, iter)
|
forAllConstIter(labelHashSet, wrongFaces, iter)
|
||||||
{
|
{
|
||||||
@ -1704,7 +1704,7 @@ void Foam::conformalVoronoiMesh::createFacesOwnerNeighbourAndPatches
|
|||||||
wordList& patchNames,
|
wordList& patchNames,
|
||||||
PtrList<dictionary>& patchDicts,
|
PtrList<dictionary>& patchDicts,
|
||||||
labelListList& patchPointPairSlaves,
|
labelListList& patchPointPairSlaves,
|
||||||
PackedBoolList& boundaryFacesToRemove,
|
bitSet& boundaryFacesToRemove,
|
||||||
bool includeEmptyPatches
|
bool includeEmptyPatches
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
@ -2486,7 +2486,7 @@ void Foam::conformalVoronoiMesh::addPatches
|
|||||||
faceList& faces,
|
faceList& faces,
|
||||||
labelList& owner,
|
labelList& owner,
|
||||||
PtrList<dictionary>& patchDicts,
|
PtrList<dictionary>& patchDicts,
|
||||||
PackedBoolList& boundaryFacesToRemove,
|
bitSet& boundaryFacesToRemove,
|
||||||
const List<DynamicList<face>>& patchFaces,
|
const List<DynamicList<face>>& patchFaces,
|
||||||
const List<DynamicList<label>>& patchOwners,
|
const List<DynamicList<label>>& patchOwners,
|
||||||
const List<DynamicList<bool>>& indirectPatchFace
|
const List<DynamicList<bool>>& indirectPatchFace
|
||||||
@ -2531,7 +2531,7 @@ void Foam::conformalVoronoiMesh::removeUnusedPoints
|
|||||||
{
|
{
|
||||||
Info<< nl << "Removing unused points" << endl;
|
Info<< nl << "Removing unused points" << endl;
|
||||||
|
|
||||||
PackedBoolList ptUsed(pts.size(), false);
|
bitSet ptUsed(pts.size(), false);
|
||||||
|
|
||||||
// Scan all faces to find all of the points that are used
|
// Scan all faces to find all of the points that are used
|
||||||
|
|
||||||
@ -2585,7 +2585,7 @@ Foam::labelList Foam::conformalVoronoiMesh::removeUnusedCells
|
|||||||
{
|
{
|
||||||
Info<< nl << "Removing unused cells" << endl;
|
Info<< nl << "Removing unused cells" << endl;
|
||||||
|
|
||||||
PackedBoolList cellUsed(vertexCount(), false);
|
bitSet cellUsed(vertexCount(), false);
|
||||||
|
|
||||||
// Scan all faces to find all of the cells that are used
|
// Scan all faces to find all of the cells that are used
|
||||||
|
|
||||||
|
|||||||
@ -2271,7 +2271,7 @@ void Foam::conformalVoronoiMesh::reinsertSurfaceConformation()
|
|||||||
|
|
||||||
ptPairs_.reIndex(oldToNewIndices);
|
ptPairs_.reIndex(oldToNewIndices);
|
||||||
|
|
||||||
PackedBoolList selectedElems(surfaceConformationVertices_.size(), true);
|
bitSet selectedElems(surfaceConformationVertices_.size(), true);
|
||||||
|
|
||||||
forAll(surfaceConformationVertices_, vI)
|
forAll(surfaceConformationVertices_, vI)
|
||||||
{
|
{
|
||||||
@ -2295,7 +2295,7 @@ void Foam::conformalVoronoiMesh::reinsertSurfaceConformation()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
inplaceSubset<PackedBoolList, List<Vb>>
|
inplaceSubset<bitSet, List<Vb>>
|
||||||
(
|
(
|
||||||
selectedElems,
|
selectedElems,
|
||||||
surfaceConformationVertices_
|
surfaceConformationVertices_
|
||||||
|
|||||||
@ -115,7 +115,7 @@ void Foam::conformalVoronoiMesh::writeMesh(const fileName& instance)
|
|||||||
wordList patchNames;
|
wordList patchNames;
|
||||||
PtrList<dictionary> patchDicts;
|
PtrList<dictionary> patchDicts;
|
||||||
pointField cellCentres;
|
pointField cellCentres;
|
||||||
PackedBoolList boundaryFacesToRemove;
|
bitSet boundaryFacesToRemove;
|
||||||
|
|
||||||
calcDualMesh
|
calcDualMesh
|
||||||
(
|
(
|
||||||
@ -377,7 +377,7 @@ void Foam::conformalVoronoiMesh::writeMesh(const fileName& instance)
|
|||||||
//
|
//
|
||||||
// Info<< nl << "Writing tetDualMesh to " << instance << endl;
|
// Info<< nl << "Writing tetDualMesh to " << instance << endl;
|
||||||
//
|
//
|
||||||
// PackedBoolList boundaryFacesToRemove;
|
// bitSet boundaryFacesToRemove;
|
||||||
// writeMesh
|
// writeMesh
|
||||||
// (
|
// (
|
||||||
// "tetDualMesh",
|
// "tetDualMesh",
|
||||||
@ -773,7 +773,7 @@ void Foam::conformalVoronoiMesh::writeMesh
|
|||||||
const wordList& patchNames,
|
const wordList& patchNames,
|
||||||
const PtrList<dictionary>& patchDicts,
|
const PtrList<dictionary>& patchDicts,
|
||||||
const pointField& cellCentres,
|
const pointField& cellCentres,
|
||||||
PackedBoolList& boundaryFacesToRemove
|
bitSet& boundaryFacesToRemove
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if (foamyHexMeshControls().objOutput())
|
if (foamyHexMeshControls().objOutput())
|
||||||
@ -949,7 +949,7 @@ void Foam::conformalVoronoiMesh::writeMesh
|
|||||||
orEqOp<unsigned int>()
|
orEqOp<unsigned int>()
|
||||||
);
|
);
|
||||||
|
|
||||||
labelList addr(boundaryFacesToRemove.used());
|
labelList addr(boundaryFacesToRemove.toc());
|
||||||
|
|
||||||
faceSet indirectPatchFaces
|
faceSet indirectPatchFaces
|
||||||
(
|
(
|
||||||
|
|||||||
@ -496,7 +496,7 @@ void Foam::CV2D::newPoints()
|
|||||||
scalar u = 1.0;
|
scalar u = 1.0;
|
||||||
scalar l = 0.7;
|
scalar l = 0.7;
|
||||||
|
|
||||||
PackedBoolList pointToBeRetained(startOfSurfacePointPairs_, true);
|
bitSet pointToBeRetained(startOfSurfacePointPairs_, true);
|
||||||
|
|
||||||
std::list<Point> pointsToInsert;
|
std::list<Point> pointsToInsert;
|
||||||
|
|
||||||
|
|||||||
@ -122,7 +122,7 @@ SourceFiles
|
|||||||
#include "point2DFieldFwd.H"
|
#include "point2DFieldFwd.H"
|
||||||
#include "dictionary.H"
|
#include "dictionary.H"
|
||||||
#include "Switch.H"
|
#include "Switch.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "EdgeMap.H"
|
#include "EdgeMap.H"
|
||||||
#include "cv2DControls.H"
|
#include "cv2DControls.H"
|
||||||
#include "tolerances.H"
|
#include "tolerances.H"
|
||||||
|
|||||||
@ -306,7 +306,7 @@ void Foam::mergeAndWrite
|
|||||||
|
|
||||||
|
|
||||||
// Determine faces on outside of cellSet
|
// Determine faces on outside of cellSet
|
||||||
PackedBoolList isInSet(mesh.nCells());
|
bitSet isInSet(mesh.nCells());
|
||||||
forAllConstIter(cellSet, set, iter)
|
forAllConstIter(cellSet, set, iter)
|
||||||
{
|
{
|
||||||
isInSet.set(iter.key());
|
isInSet.set(iter.key());
|
||||||
|
|||||||
@ -660,7 +660,7 @@ Foam::label Foam::checkTopology
|
|||||||
|
|
||||||
const cellList& cells = mesh.cells();
|
const cellList& cells = mesh.cells();
|
||||||
const faceList& faces = mesh.faces();
|
const faceList& faces = mesh.faces();
|
||||||
PackedBoolList isZonePoint(mesh.nPoints());
|
bitSet isZonePoint(mesh.nPoints());
|
||||||
|
|
||||||
for (const cellZone& cZone : cellZones)
|
for (const cellZone& cZone : cellZones)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -192,7 +192,7 @@ void modifyOrAddFace
|
|||||||
const label zoneID,
|
const label zoneID,
|
||||||
const bool zoneFlip,
|
const bool zoneFlip,
|
||||||
|
|
||||||
PackedBoolList& modifiedFace
|
bitSet& modifiedFace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (modifiedFace.set(facei))
|
if (modifiedFace.set(facei))
|
||||||
@ -247,7 +247,7 @@ void createFaces
|
|||||||
const labelList& newMasterPatches,
|
const labelList& newMasterPatches,
|
||||||
const labelList& newSlavePatches,
|
const labelList& newSlavePatches,
|
||||||
polyTopoChange& meshMod,
|
polyTopoChange& meshMod,
|
||||||
PackedBoolList& modifiedFace,
|
bitSet& modifiedFace,
|
||||||
label& nModified
|
label& nModified
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -538,15 +538,13 @@ int main(int argc, char *argv[])
|
|||||||
if (mesh.faceZones().findZoneID(name) == -1)
|
if (mesh.faceZones().findZoneID(name) == -1)
|
||||||
{
|
{
|
||||||
mesh.faceZones().clearAddressing();
|
mesh.faceZones().clearAddressing();
|
||||||
label sz = mesh.faceZones().size();
|
const label zoneID = mesh.faceZones().size();
|
||||||
|
|
||||||
labelList addr(0);
|
mesh.faceZones().setSize(zoneID+1);
|
||||||
boolList flip(0);
|
|
||||||
mesh.faceZones().setSize(sz+1);
|
|
||||||
mesh.faceZones().set
|
mesh.faceZones().set
|
||||||
(
|
(
|
||||||
sz,
|
zoneID,
|
||||||
new faceZone(name, addr, flip, sz, mesh.faceZones())
|
new faceZone(name, labelList(), false, zoneID, mesh.faceZones())
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -604,7 +602,14 @@ int main(int argc, char *argv[])
|
|||||||
mesh.faceZones().set
|
mesh.faceZones().set
|
||||||
(
|
(
|
||||||
zoneID,
|
zoneID,
|
||||||
new faceZone(name, addr, flip, zoneID, mesh.faceZones())
|
new faceZone
|
||||||
|
(
|
||||||
|
name,
|
||||||
|
std::move(addr),
|
||||||
|
std::move(flip),
|
||||||
|
zoneID,
|
||||||
|
mesh.faceZones()
|
||||||
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -751,7 +756,7 @@ int main(int argc, char *argv[])
|
|||||||
// side come first and faces from the other side next.
|
// side come first and faces from the other side next.
|
||||||
|
|
||||||
// Whether first use of face (modify) or consecutive (add)
|
// Whether first use of face (modify) or consecutive (add)
|
||||||
PackedBoolList modifiedFace(mesh.nFaces());
|
bitSet modifiedFace(mesh.nFaces());
|
||||||
label nModified = 0;
|
label nModified = 0;
|
||||||
|
|
||||||
forAll(selectors, selectorI)
|
forAll(selectors, selectorI)
|
||||||
|
|||||||
@ -483,7 +483,7 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
candidates.setCapacity(sz);
|
candidates.setCapacity(sz);
|
||||||
|
|
||||||
PackedBoolList isCandidate(mesh.nPoints());
|
bitSet isCandidate(mesh.nPoints());
|
||||||
forAll(splitPatchIDs, i)
|
forAll(splitPatchIDs, i)
|
||||||
{
|
{
|
||||||
const labelList& mp = patches[splitPatchIDs[i]].meshPoints();
|
const labelList& mp = patches[splitPatchIDs[i]].meshPoints();
|
||||||
|
|||||||
@ -87,7 +87,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
const PackedBoolList isMasterFace(syncTools::getMasterFaces(mesh));
|
const bitSet isMasterFace(syncTools::getMasterFaces(mesh));
|
||||||
|
|
||||||
|
|
||||||
// Data on all edges and faces
|
// Data on all edges and faces
|
||||||
|
|||||||
@ -146,7 +146,7 @@ Foam::label Foam::meshDualiser::findDualCell
|
|||||||
|
|
||||||
void Foam::meshDualiser::generateDualBoundaryEdges
|
void Foam::meshDualiser::generateDualBoundaryEdges
|
||||||
(
|
(
|
||||||
const PackedBoolList& isBoundaryEdge,
|
const bitSet& isBoundaryEdge,
|
||||||
const label pointi,
|
const label pointi,
|
||||||
polyTopoChange& meshMod
|
polyTopoChange& meshMod
|
||||||
)
|
)
|
||||||
@ -374,7 +374,7 @@ Foam::label Foam::meshDualiser::addBoundaryFace
|
|||||||
void Foam::meshDualiser::createFacesAroundEdge
|
void Foam::meshDualiser::createFacesAroundEdge
|
||||||
(
|
(
|
||||||
const bool splitFace,
|
const bool splitFace,
|
||||||
const PackedBoolList& isBoundaryEdge,
|
const bitSet& isBoundaryEdge,
|
||||||
const label edgeI,
|
const label edgeI,
|
||||||
const label startFacei,
|
const label startFacei,
|
||||||
polyTopoChange& meshMod,
|
polyTopoChange& meshMod,
|
||||||
@ -886,7 +886,7 @@ void Foam::meshDualiser::setRefinement
|
|||||||
// Mark boundary edges and points.
|
// Mark boundary edges and points.
|
||||||
// (Note: in 1.4.2 we can use the built-in mesh point ordering
|
// (Note: in 1.4.2 we can use the built-in mesh point ordering
|
||||||
// facility instead)
|
// facility instead)
|
||||||
PackedBoolList isBoundaryEdge(mesh_.nEdges());
|
bitSet isBoundaryEdge(mesh_.nEdges());
|
||||||
for (label facei = mesh_.nInternalFaces(); facei < mesh_.nFaces(); facei++)
|
for (label facei = mesh_.nInternalFaces(); facei < mesh_.nFaces(); facei++)
|
||||||
{
|
{
|
||||||
const labelList& fEdges = mesh_.faceEdges()[facei];
|
const labelList& fEdges = mesh_.faceEdges()[facei];
|
||||||
|
|||||||
@ -48,7 +48,7 @@ SourceFiles
|
|||||||
#define meshDualiser_H
|
#define meshDualiser_H
|
||||||
|
|
||||||
#include "DynamicList.H"
|
#include "DynamicList.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "boolList.H"
|
#include "boolList.H"
|
||||||
#include "typeInfo.H"
|
#include "typeInfo.H"
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ class meshDualiser
|
|||||||
// emanating from (boundary & feature) point
|
// emanating from (boundary & feature) point
|
||||||
void generateDualBoundaryEdges
|
void generateDualBoundaryEdges
|
||||||
(
|
(
|
||||||
const PackedBoolList& isBoundaryEdge,
|
const bitSet& isBoundaryEdge,
|
||||||
const label pointi,
|
const label pointi,
|
||||||
polyTopoChange& meshMod
|
polyTopoChange& meshMod
|
||||||
);
|
);
|
||||||
@ -143,7 +143,7 @@ class meshDualiser
|
|||||||
void createFacesAroundEdge
|
void createFacesAroundEdge
|
||||||
(
|
(
|
||||||
const bool splitFace,
|
const bool splitFace,
|
||||||
const PackedBoolList& isBoundaryEdge,
|
const bitSet& isBoundaryEdge,
|
||||||
const label edgeI,
|
const label edgeI,
|
||||||
const label startFacei,
|
const label startFacei,
|
||||||
polyTopoChange& meshMod,
|
polyTopoChange& meshMod,
|
||||||
|
|||||||
@ -67,7 +67,7 @@ Note
|
|||||||
#include "unitConversion.H"
|
#include "unitConversion.H"
|
||||||
#include "polyTopoChange.H"
|
#include "polyTopoChange.H"
|
||||||
#include "mapPolyMesh.H"
|
#include "mapPolyMesh.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "meshTools.H"
|
#include "meshTools.H"
|
||||||
#include "OFstream.H"
|
#include "OFstream.H"
|
||||||
#include "meshDualiser.H"
|
#include "meshDualiser.H"
|
||||||
@ -87,7 +87,7 @@ using namespace Foam;
|
|||||||
void simpleMarkFeatures
|
void simpleMarkFeatures
|
||||||
(
|
(
|
||||||
const polyMesh& mesh,
|
const polyMesh& mesh,
|
||||||
const PackedBoolList& isBoundaryEdge,
|
const bitSet& isBoundaryEdge,
|
||||||
const scalar featureAngle,
|
const scalar featureAngle,
|
||||||
const bool concaveMultiCells,
|
const bool concaveMultiCells,
|
||||||
const bool doNotPreserveFaceZones,
|
const bool doNotPreserveFaceZones,
|
||||||
@ -390,7 +390,7 @@ int main(int argc, char *argv[])
|
|||||||
// Mark boundary edges and points.
|
// Mark boundary edges and points.
|
||||||
// (Note: in 1.4.2 we can use the built-in mesh point ordering
|
// (Note: in 1.4.2 we can use the built-in mesh point ordering
|
||||||
// facility instead)
|
// facility instead)
|
||||||
PackedBoolList isBoundaryEdge(mesh.nEdges());
|
bitSet isBoundaryEdge(mesh.nEdges());
|
||||||
for (label facei = mesh.nInternalFaces(); facei < mesh.nFaces(); facei++)
|
for (label facei = mesh.nInternalFaces(); facei < mesh.nFaces(); facei++)
|
||||||
{
|
{
|
||||||
const labelList& fEdges = mesh.faceEdges()[facei];
|
const labelList& fEdges = mesh.faceEdges()[facei];
|
||||||
|
|||||||
@ -79,7 +79,7 @@ void printEdgeStats(const polyMesh& mesh)
|
|||||||
scalar minOther = GREAT;
|
scalar minOther = GREAT;
|
||||||
scalar maxOther = -GREAT;
|
scalar maxOther = -GREAT;
|
||||||
|
|
||||||
PackedBoolList isMasterEdge(syncTools::getMasterEdges(mesh));
|
bitSet isMasterEdge(syncTools::getMasterEdges(mesh));
|
||||||
|
|
||||||
const edgeList& edges = mesh.edges();
|
const edgeList& edges = mesh.edges();
|
||||||
|
|
||||||
|
|||||||
@ -303,7 +303,7 @@ void subsetTopoSets
|
|||||||
Info<< "Subsetting " << set.type() << " " << set.name() << endl;
|
Info<< "Subsetting " << set.type() << " " << set.name() << endl;
|
||||||
|
|
||||||
// Map the data
|
// Map the data
|
||||||
PackedBoolList isSet(set.maxSize(mesh));
|
bitSet isSet(set.maxSize(mesh));
|
||||||
forAllConstIters(set, iter)
|
forAllConstIters(set, iter)
|
||||||
{
|
{
|
||||||
isSet.set(iter.key());
|
isSet.set(iter.key());
|
||||||
|
|||||||
@ -32,7 +32,7 @@ Description
|
|||||||
|
|
||||||
#include "domainDecomposition.H"
|
#include "domainDecomposition.H"
|
||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "boolList.H"
|
#include "bitSet.H"
|
||||||
#include "cyclicPolyPatch.H"
|
#include "cyclicPolyPatch.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
||||||
@ -434,7 +434,6 @@ void Foam::domainDecomposition::decomposeMesh()
|
|||||||
// }
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Info<< "\nDistributing points to processors" << endl;
|
Info<< "\nDistributing points to processors" << endl;
|
||||||
// For every processor, loop through the list of faces for the processor.
|
// For every processor, loop through the list of faces for the processor.
|
||||||
// For every face, loop through the list of points and mark the point as
|
// For every face, loop through the list of points and mark the point as
|
||||||
@ -443,42 +442,19 @@ void Foam::domainDecomposition::decomposeMesh()
|
|||||||
|
|
||||||
forAll(procPointAddressing_, proci)
|
forAll(procPointAddressing_, proci)
|
||||||
{
|
{
|
||||||
boolList pointLabels(nPoints(), false);
|
bitSet pointsInUse(nPoints(), false);
|
||||||
|
|
||||||
// Get reference to list of used faces
|
// For each of the faces used
|
||||||
const labelList& procFaceLabels = procFaceAddressing_[proci];
|
for (const label facei : procFaceAddressing_[proci])
|
||||||
|
|
||||||
forAll(procFaceLabels, facei)
|
|
||||||
{
|
{
|
||||||
// Because of the turning index, some labels may be negative
|
// Because of the turning index, some face labels may be -ve
|
||||||
const labelList& facePoints = fcs[mag(procFaceLabels[facei]) - 1];
|
const labelList& facePoints = fcs[mag(facei) - 1];
|
||||||
|
|
||||||
forAll(facePoints, pointi)
|
// Mark the face points as being used
|
||||||
{
|
pointsInUse.setMany(facePoints);
|
||||||
// Mark the point as used
|
|
||||||
pointLabels[facePoints[pointi]] = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Collect the used points
|
procPointAddressing_[proci] = pointsInUse.sortedToc();
|
||||||
labelList& procPointLabels = procPointAddressing_[proci];
|
|
||||||
|
|
||||||
procPointLabels.setSize(pointLabels.size());
|
|
||||||
|
|
||||||
label nUsedPoints = 0;
|
|
||||||
|
|
||||||
forAll(pointLabels, pointi)
|
|
||||||
{
|
|
||||||
if (pointLabels[pointi])
|
|
||||||
{
|
|
||||||
procPointLabels[nUsedPoints] = pointi;
|
|
||||||
|
|
||||||
nUsedPoints++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Reset the size of used points
|
|
||||||
procPointLabels.setSize(nUsedPoints);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -41,7 +41,7 @@ Usage
|
|||||||
#include "triSurfaceMesh.H"
|
#include "triSurfaceMesh.H"
|
||||||
#include "indexedOctree.H"
|
#include "indexedOctree.H"
|
||||||
#include "treeBoundBox.H"
|
#include "treeBoundBox.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "unitConversion.H"
|
#include "unitConversion.H"
|
||||||
#include "searchableSurfaces.H"
|
#include "searchableSurfaces.H"
|
||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
@ -329,7 +329,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
List<DynamicList<labelledTri>> newFaces(surfs.size());
|
List<DynamicList<labelledTri>> newFaces(surfs.size());
|
||||||
List<DynamicList<point>> newPoints(surfs.size());
|
List<DynamicList<point>> newPoints(surfs.size());
|
||||||
List<PackedBoolList> visitedFace(surfs.size());
|
List<bitSet> visitedFace(surfs.size());
|
||||||
|
|
||||||
PtrList<triSurfaceMesh> newSurfaces(surfs.size());
|
PtrList<triSurfaceMesh> newSurfaces(surfs.size());
|
||||||
forAll(surfs, surfI)
|
forAll(surfs, surfI)
|
||||||
@ -370,7 +370,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
newFaces[surfI] = newSurf.localFaces();
|
newFaces[surfI] = newSurf.localFaces();
|
||||||
newPoints[surfI] = newSurf.localPoints();
|
newPoints[surfI] = newSurf.localPoints();
|
||||||
visitedFace[surfI] = PackedBoolList(newSurf.size(), false);
|
visitedFace[surfI] = bitSet(newSurf.size(), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
forAll(newSurfaces, surfI)
|
forAll(newSurfaces, surfI)
|
||||||
|
|||||||
@ -54,7 +54,7 @@ Usage
|
|||||||
#include "triSurfaceFields.H"
|
#include "triSurfaceFields.H"
|
||||||
#include "triSurfaceMesh.H"
|
#include "triSurfaceMesh.H"
|
||||||
#include "triSurfaceGeoMesh.H"
|
#include "triSurfaceGeoMesh.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "OBJstream.H"
|
#include "OBJstream.H"
|
||||||
#include "surfaceFeatures.H"
|
#include "surfaceFeatures.H"
|
||||||
|
|
||||||
@ -131,7 +131,7 @@ tmp<vectorField> calcVertexNormals(const triSurface& surf)
|
|||||||
tmp<vectorField> calcPointNormals
|
tmp<vectorField> calcPointNormals
|
||||||
(
|
(
|
||||||
const triSurface& s,
|
const triSurface& s,
|
||||||
const PackedBoolList& isFeaturePoint,
|
const bitSet& isFeaturePoint,
|
||||||
const List<surfaceFeatures::edgeStatus>& edgeStat
|
const List<surfaceFeatures::edgeStatus>& edgeStat
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -215,7 +215,7 @@ tmp<vectorField> calcPointNormals
|
|||||||
void detectSelfIntersections
|
void detectSelfIntersections
|
||||||
(
|
(
|
||||||
const triSurfaceMesh& s,
|
const triSurfaceMesh& s,
|
||||||
PackedBoolList& isEdgeIntersecting
|
bitSet& isEdgeIntersecting
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const edgeList& edges = s.edges();
|
const edgeList& edges = s.edges();
|
||||||
@ -258,9 +258,9 @@ label detectIntersectionPoints
|
|||||||
const vectorField& displacement,
|
const vectorField& displacement,
|
||||||
|
|
||||||
const bool checkSelfIntersect,
|
const bool checkSelfIntersect,
|
||||||
const PackedBoolList& initialIsEdgeIntersecting,
|
const bitSet& initialIsEdgeIntersecting,
|
||||||
|
|
||||||
PackedBoolList& isPointOnHitEdge,
|
bitSet& isPointOnHitEdge,
|
||||||
scalarField& scale
|
scalarField& scale
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -307,7 +307,7 @@ label detectIntersectionPoints
|
|||||||
// 2. (new) surface self intersections
|
// 2. (new) surface self intersections
|
||||||
if (checkSelfIntersect)
|
if (checkSelfIntersect)
|
||||||
{
|
{
|
||||||
PackedBoolList isEdgeIntersecting;
|
bitSet isEdgeIntersecting;
|
||||||
detectSelfIntersections(s, isEdgeIntersecting);
|
detectSelfIntersections(s, isEdgeIntersecting);
|
||||||
|
|
||||||
const edgeList& edges = s.edges();
|
const edgeList& edges = s.edges();
|
||||||
@ -400,7 +400,7 @@ tmp<scalarField> avg
|
|||||||
void minSmooth
|
void minSmooth
|
||||||
(
|
(
|
||||||
const triSurface& s,
|
const triSurface& s,
|
||||||
const PackedBoolList& isAffectedPoint,
|
const bitSet& isAffectedPoint,
|
||||||
const scalarField& fld,
|
const scalarField& fld,
|
||||||
scalarField& newFld
|
scalarField& newFld
|
||||||
)
|
)
|
||||||
@ -442,19 +442,19 @@ void lloydsSmoothing
|
|||||||
(
|
(
|
||||||
const label nSmooth,
|
const label nSmooth,
|
||||||
triSurface& s,
|
triSurface& s,
|
||||||
const PackedBoolList& isFeaturePoint,
|
const bitSet& isFeaturePoint,
|
||||||
const List<surfaceFeatures::edgeStatus>& edgeStat,
|
const List<surfaceFeatures::edgeStatus>& edgeStat,
|
||||||
const PackedBoolList& isAffectedPoint
|
const bitSet& isAffectedPoint
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const labelList& meshPoints = s.meshPoints();
|
const labelList& meshPoints = s.meshPoints();
|
||||||
const edgeList& edges = s.edges();
|
const edgeList& edges = s.edges();
|
||||||
|
|
||||||
|
|
||||||
PackedBoolList isSmoothPoint(isAffectedPoint);
|
bitSet isSmoothPoint(isAffectedPoint);
|
||||||
// Extend isSmoothPoint
|
// Extend isSmoothPoint
|
||||||
{
|
{
|
||||||
PackedBoolList newIsSmoothPoint(isSmoothPoint);
|
bitSet newIsSmoothPoint(isSmoothPoint);
|
||||||
forAll(edges, edgeI)
|
forAll(edges, edgeI)
|
||||||
{
|
{
|
||||||
const edge& e = edges[edgeI];
|
const edge& e = edges[edgeI];
|
||||||
@ -539,7 +539,7 @@ void lloydsSmoothing
|
|||||||
|
|
||||||
// Extend isSmoothPoint
|
// Extend isSmoothPoint
|
||||||
{
|
{
|
||||||
PackedBoolList newIsSmoothPoint(isSmoothPoint);
|
bitSet newIsSmoothPoint(isSmoothPoint);
|
||||||
forAll(edges, edgeI)
|
forAll(edges, edgeI)
|
||||||
{
|
{
|
||||||
const edge& e = edges[edgeI];
|
const edge& e = edges[edgeI];
|
||||||
@ -662,7 +662,7 @@ int main(int argc, char *argv[])
|
|||||||
<< " out of " << s.nEdges() << nl
|
<< " out of " << s.nEdges() << nl
|
||||||
<< endl;
|
<< endl;
|
||||||
|
|
||||||
PackedBoolList isFeaturePoint(s.nPoints(), features.featurePoints());
|
bitSet isFeaturePoint(s.nPoints(), features.featurePoints());
|
||||||
|
|
||||||
const List<surfaceFeatures::edgeStatus> edgeStat(features.toStatus());
|
const List<surfaceFeatures::edgeStatus> edgeStat(features.toStatus());
|
||||||
|
|
||||||
@ -723,11 +723,11 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
// Any point on any intersected edge in any of the iterations
|
// Any point on any intersected edge in any of the iterations
|
||||||
PackedBoolList isScaledPoint(s.nPoints());
|
bitSet isScaledPoint(s.nPoints());
|
||||||
|
|
||||||
|
|
||||||
// Detect any self intersections on initial mesh
|
// Detect any self intersections on initial mesh
|
||||||
PackedBoolList initialIsEdgeIntersecting;
|
bitSet initialIsEdgeIntersecting;
|
||||||
if (checkSelfIntersect)
|
if (checkSelfIntersect)
|
||||||
{
|
{
|
||||||
detectSelfIntersections(s, initialIsEdgeIntersecting);
|
detectSelfIntersections(s, initialIsEdgeIntersecting);
|
||||||
@ -775,7 +775,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
|
|
||||||
// Detect any intersections and scale back
|
// Detect any intersections and scale back
|
||||||
PackedBoolList isAffectedPoint;
|
bitSet isAffectedPoint;
|
||||||
label nIntersections = detectIntersectionPoints
|
label nIntersections = detectIntersectionPoints
|
||||||
(
|
(
|
||||||
1e-9, // intersection tolerance
|
1e-9, // intersection tolerance
|
||||||
@ -818,7 +818,7 @@ int main(int argc, char *argv[])
|
|||||||
minSmooth
|
minSmooth
|
||||||
(
|
(
|
||||||
s,
|
s,
|
||||||
PackedBoolList(s.nPoints(), true),
|
bitSet(s.nPoints(), true),
|
||||||
oldScale,
|
oldScale,
|
||||||
scale
|
scale
|
||||||
);
|
);
|
||||||
|
|||||||
@ -54,7 +54,7 @@ using namespace Foam;
|
|||||||
tmp<pointField> avg
|
tmp<pointField> avg
|
||||||
(
|
(
|
||||||
const meshedSurface& s,
|
const meshedSurface& s,
|
||||||
const PackedBoolList& fixedPoints
|
const bitSet& fixedPoints
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const labelListList& pointEdges = s.pointEdges();
|
const labelListList& pointEdges = s.pointEdges();
|
||||||
@ -95,7 +95,7 @@ void getFixedPoints
|
|||||||
(
|
(
|
||||||
const edgeMesh& feMesh,
|
const edgeMesh& feMesh,
|
||||||
const pointField& points,
|
const pointField& points,
|
||||||
PackedBoolList& fixedPoints
|
bitSet& fixedPoints
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
scalarList matchDistance(feMesh.points().size(), 1e-1);
|
scalarList matchDistance(feMesh.points().size(), 1e-1);
|
||||||
@ -177,7 +177,7 @@ int main(int argc, char *argv[])
|
|||||||
<< "Vertices : " << surf1.nPoints() << nl
|
<< "Vertices : " << surf1.nPoints() << nl
|
||||||
<< "Bounding Box: " << boundBox(surf1.localPoints()) << endl;
|
<< "Bounding Box: " << boundBox(surf1.localPoints()) << endl;
|
||||||
|
|
||||||
PackedBoolList fixedPoints(surf1.localPoints().size(), false);
|
bitSet fixedPoints(surf1.localPoints().size(), false);
|
||||||
|
|
||||||
if (args.found("featureFile"))
|
if (args.found("featureFile"))
|
||||||
{
|
{
|
||||||
|
|||||||
@ -390,6 +390,7 @@ DebugSwitches
|
|||||||
basicMixture 0;
|
basicMixture 0;
|
||||||
basicReactingCloud 0;
|
basicReactingCloud 0;
|
||||||
basicReactingParcel 0;
|
basicReactingParcel 0;
|
||||||
|
bitSet 0;
|
||||||
fluidThermo 0;
|
fluidThermo 0;
|
||||||
fluidThermoCloud 0;
|
fluidThermoCloud 0;
|
||||||
fluidThermoParcel 0;
|
fluidThermoParcel 0;
|
||||||
|
|||||||
@ -145,11 +145,12 @@ primitives/polynomialEqns/quadraticEqn/quadraticEqn.C
|
|||||||
primitives/Barycentric/barycentric/barycentric.C
|
primitives/Barycentric/barycentric/barycentric.C
|
||||||
primitives/Barycentric2D/barycentric2D/barycentric2D.C
|
primitives/Barycentric2D/barycentric2D/barycentric2D.C
|
||||||
|
|
||||||
|
containers/Bits/bitSet/bitSet.C
|
||||||
|
containers/Bits/bitSet/bitSetIO.C
|
||||||
|
containers/Bits/PackedList/PackedListCore.C
|
||||||
containers/HashTables/HashOps/HashOps.C
|
containers/HashTables/HashOps/HashOps.C
|
||||||
containers/HashTables/HashTable/HashTableCore.C
|
containers/HashTables/HashTable/HashTableCore.C
|
||||||
containers/Lists/SortableList/ParSortableListName.C
|
containers/Lists/SortableList/ParSortableListName.C
|
||||||
containers/Lists/PackedList/PackedListCore.C
|
|
||||||
containers/Lists/PackedList/PackedBoolList.C
|
|
||||||
containers/Lists/ListOps/ListOps.C
|
containers/Lists/ListOps/ListOps.C
|
||||||
containers/LinkedLists/linkTypes/SLListBase/SLListBase.C
|
containers/LinkedLists/linkTypes/SLListBase/SLListBase.C
|
||||||
containers/LinkedLists/linkTypes/DLListBase/DLListBase.C
|
containers/LinkedLists/linkTypes/DLListBase/DLListBase.C
|
||||||
|
|||||||
192
src/OpenFOAM/containers/Bits/BitOps/BitOps.H
Normal file
192
src/OpenFOAM/containers/Bits/BitOps/BitOps.H
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Namespace
|
||||||
|
Foam::BitOps
|
||||||
|
|
||||||
|
Description
|
||||||
|
Various bit-wise operations, etc.
|
||||||
|
|
||||||
|
The population count uses the Hamming weight
|
||||||
|
(http://en.wikipedia.org/wiki/Hamming_weight).
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef BitOps_H
|
||||||
|
#define BitOps_H
|
||||||
|
|
||||||
|
#include "label.H"
|
||||||
|
#include "Ostream.H"
|
||||||
|
#include <limits>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Namespace BitOps Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
namespace BitOps
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
//- Count arbitrary number of bits (of an integral type)
|
||||||
|
template<class UIntType>
|
||||||
|
inline unsigned int bit_count(UIntType x)
|
||||||
|
{
|
||||||
|
unsigned int n = 0u;
|
||||||
|
|
||||||
|
for (; x; ++n) { x &= (x-1); }
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Count bits in a 32-bit value (Hamming weight method)
|
||||||
|
template<>
|
||||||
|
inline unsigned int bit_count(uint32_t x)
|
||||||
|
{
|
||||||
|
x -= (x >> 1) & 0x55555555;
|
||||||
|
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
|
||||||
|
|
||||||
|
return ((((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Count bits in a 64-bit value (Hamming weight method)
|
||||||
|
template<>
|
||||||
|
inline unsigned int bit_count(uint64_t x)
|
||||||
|
{
|
||||||
|
x -= (x >> 1) & 0x5555555555555555;
|
||||||
|
x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333);
|
||||||
|
|
||||||
|
return unsigned
|
||||||
|
((((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Repeat a value of the given BitWidth into the destination output type.
|
||||||
|
template<class UIntType, unsigned BitWidth>
|
||||||
|
inline UIntType repeat_value(unsigned val)
|
||||||
|
{
|
||||||
|
static_assert
|
||||||
|
(
|
||||||
|
BitWidth && std::numeric_limits<UIntType>::digits >= BitWidth,
|
||||||
|
"BitWidth too large for target output"
|
||||||
|
);
|
||||||
|
|
||||||
|
// How many fit into the target
|
||||||
|
const unsigned nrepeat = (std::numeric_limits<UIntType>::digits / BitWidth);
|
||||||
|
|
||||||
|
// Max value for a single element
|
||||||
|
const unsigned mask = ((1u << BitWidth) - 1);
|
||||||
|
|
||||||
|
// The first occurance
|
||||||
|
UIntType fillval = ((val >= mask) ? mask : val);
|
||||||
|
|
||||||
|
// Repeated
|
||||||
|
for (unsigned i = 1; i < nrepeat; ++i)
|
||||||
|
{
|
||||||
|
fillval |= (fillval << BitWidth);
|
||||||
|
}
|
||||||
|
|
||||||
|
return fillval;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- Print 0/1 bits in the (unsigned) integral type
|
||||||
|
template<class UIntType>
|
||||||
|
inline Ostream& print(Ostream& os, UIntType value, char off='0', char on='1')
|
||||||
|
{
|
||||||
|
if (os.format() == IOstream::BINARY)
|
||||||
|
{
|
||||||
|
// Perhaps not the most sensible, but the only thing we currently have.
|
||||||
|
os << label(value);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Starting from most significant bit - makes for easy reading.
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned test = (1u << (std::numeric_limits<UIntType>::digits-1));
|
||||||
|
test;
|
||||||
|
test >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
os << ((value & test) ? on : off);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//- An (unsigned) integral type adapter, for output of bit values
|
||||||
|
template<class UIntType>
|
||||||
|
struct bitInfo
|
||||||
|
{
|
||||||
|
typedef UIntType value_type;
|
||||||
|
|
||||||
|
value_type value;
|
||||||
|
|
||||||
|
//- Null constructible as zero
|
||||||
|
bitInfo() : value(0) {}
|
||||||
|
|
||||||
|
//- Value construct
|
||||||
|
explicit bitInfo(UIntType val) : value(val) {}
|
||||||
|
|
||||||
|
//- Conversion to base type
|
||||||
|
operator UIntType () const { return value; }
|
||||||
|
|
||||||
|
//- Conversion to base type
|
||||||
|
operator UIntType& () { return value; }
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // End namespace BitOps
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
//- Print 0/1 bits of an (unsigned) integral type via an adapter
|
||||||
|
template<class UIntType>
|
||||||
|
inline Ostream& operator<<(Ostream& os, const BitOps::bitInfo<UIntType>& info)
|
||||||
|
{
|
||||||
|
BitOps::print(os, info.value);
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
120
src/OpenFOAM/containers/Bits/PackedList/PackedList.C
Normal file
120
src/OpenFOAM/containers/Bits/PackedList/PackedList.C
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "PackedList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
bool Foam::PackedList<Width>::uniform() const
|
||||||
|
{
|
||||||
|
if (size() < 2)
|
||||||
|
{
|
||||||
|
return false; // Trivial case
|
||||||
|
}
|
||||||
|
|
||||||
|
// The value of the first element for testing
|
||||||
|
const unsigned int val = get(0);
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
bool identical = true;
|
||||||
|
|
||||||
|
if (!val)
|
||||||
|
{
|
||||||
|
// Zero value: can just check block content directly
|
||||||
|
|
||||||
|
for (label blocki = 0; identical && blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
identical = !blocks_[blocki];
|
||||||
|
}
|
||||||
|
|
||||||
|
return identical;
|
||||||
|
}
|
||||||
|
else if (nblocks > 1)
|
||||||
|
{
|
||||||
|
// Check all blocks that are completely occupied: (nblocks-1)
|
||||||
|
const unsigned int blockval =
|
||||||
|
BitOps::repeat_value<block_type,Width>(val);
|
||||||
|
|
||||||
|
for (label blocki = 0; identical && blocki < (nblocks-1); ++blocki)
|
||||||
|
{
|
||||||
|
identical = (blocks_[blocki] == blockval);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Partial block: check manually
|
||||||
|
for
|
||||||
|
(
|
||||||
|
label elemi = elem_per_block*(nblocks-1);
|
||||||
|
identical && elemi < size();
|
||||||
|
++elemi
|
||||||
|
)
|
||||||
|
{
|
||||||
|
identical = (val == get(elemi));
|
||||||
|
}
|
||||||
|
|
||||||
|
return identical;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::labelList Foam::PackedList<Width>::values() const
|
||||||
|
{
|
||||||
|
if (size() < 2 || uniform())
|
||||||
|
{
|
||||||
|
const label val = (size() ? get(0) : 0);
|
||||||
|
|
||||||
|
return labelList(size(), val);
|
||||||
|
}
|
||||||
|
|
||||||
|
labelList output(size());
|
||||||
|
label outi = 0;
|
||||||
|
|
||||||
|
// Process n-1 complete blocks
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
for (label blocki=0; blocki < nblocks-1; ++blocki)
|
||||||
|
{
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
|
||||||
|
for (unsigned nget = elem_per_block; nget; --nget, ++outi)
|
||||||
|
{
|
||||||
|
output[outi] = label(blockval & max_value);
|
||||||
|
blockval >>= Width;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Any partial blocks
|
||||||
|
for (/*nil*/; outi < size(); ++outi)
|
||||||
|
{
|
||||||
|
output[outi] = get(outi);
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -25,11 +25,11 @@ Class
|
|||||||
Foam::PackedList
|
Foam::PackedList
|
||||||
|
|
||||||
Description
|
Description
|
||||||
A dynamically list of packed unsigned integers, with the number of bits
|
A dynamic list of packed unsigned integers, with the number of bits
|
||||||
per item specified by the \<nBits\> template parameter.
|
per item specified by the \<Width\> template parameter.
|
||||||
|
|
||||||
Resizing is similar to DynamicList so that clear() and resize() affect
|
Resizing is similar to DynamicList so that clear() and resize() affect
|
||||||
the addessed size, but not the allocated size. The reserve() and
|
the addressed size, but not the allocated size. The reserve() and
|
||||||
setCapacity() methods can be used to influence the allocation.
|
setCapacity() methods can be used to influence the allocation.
|
||||||
|
|
||||||
Note
|
Note
|
||||||
@ -37,13 +37,20 @@ Note
|
|||||||
with out-of-range elements returned as zero.
|
with out-of-range elements returned as zero.
|
||||||
|
|
||||||
In a non-const context, the '[]' operator returns a reference to an
|
In a non-const context, the '[]' operator returns a reference to an
|
||||||
existing value. Some caution with out-of-range elements to ensure
|
existing value. When accessing out-of-range elements, some caution
|
||||||
that the const version of the [] operator is being called.
|
is required to ensure that the const version of the [] operator is actually
|
||||||
The get() method is functionally identical to the '[]' operator, but
|
being called.
|
||||||
|
The get() method is functionally identical the the '[]' operator, but
|
||||||
is always const access.
|
is always const access.
|
||||||
|
|
||||||
The set() and unset() methods return a bool if the value changed.
|
The set() and unset() methods return a bool if the value changed.
|
||||||
This can be useful for branching on changed values.
|
|
||||||
|
With const access, the get() method and 'operator[]' are identical.
|
||||||
|
With non-const access, the 'operator[]' may be marginally slower get().
|
||||||
|
|
||||||
|
The set() method may be marginally faster than using the 'operator[]'
|
||||||
|
supports auto-vivification and also returns a bool if the value changed,
|
||||||
|
which can be useful for branching on changed values.
|
||||||
|
|
||||||
\code
|
\code
|
||||||
list.set(5, 4);
|
list.set(5, 4);
|
||||||
@ -56,27 +63,38 @@ Note
|
|||||||
For example,
|
For example,
|
||||||
\code
|
\code
|
||||||
list.resize(4);
|
list.resize(4);
|
||||||
Info<< list.get(10) << "\n"; // print zero, but doesn't adjust list
|
Info<< list.get(10) << "\n"; // print zero, but doesn't adjust list
|
||||||
|
list.set(8); // auto-vivify
|
||||||
\endcode
|
\endcode
|
||||||
|
|
||||||
Also note that all unused internal storage elements are guaranteed to
|
Also note that all unused internal storage elements are guaranteed to
|
||||||
always be bit-wise zero. This property must not be violated by any
|
always be bit-wise zero. This property must not be violated by any
|
||||||
inheriting classes.
|
inheriting classes.
|
||||||
|
|
||||||
|
Note
|
||||||
|
Iterators for this class have been intentionally removed, for performance
|
||||||
|
reasons.
|
||||||
|
|
||||||
See also
|
See also
|
||||||
|
Foam::BitOps
|
||||||
Foam::DynamicList
|
Foam::DynamicList
|
||||||
|
|
||||||
SourceFiles
|
SourceFiles
|
||||||
PackedListI.H
|
PackedListI.H
|
||||||
PackedList.C
|
PackedList.C
|
||||||
|
PackedListIO.C
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#ifndef PackedList_H
|
#ifndef PackedList_H
|
||||||
#define PackedList_H
|
#define PackedList_H
|
||||||
|
|
||||||
|
#include "BitOps.H"
|
||||||
#include "labelList.H"
|
#include "labelList.H"
|
||||||
#include "UIndirectList.H"
|
#include "UIndirectList.H"
|
||||||
|
#include "InfoProxy.H"
|
||||||
|
#include "PackedListCore.H"
|
||||||
|
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -85,51 +103,102 @@ namespace Foam
|
|||||||
{
|
{
|
||||||
|
|
||||||
// Forward declarations
|
// Forward declarations
|
||||||
template<unsigned nBits> class PackedList;
|
template<unsigned Width> class PackedList;
|
||||||
class Istream;
|
class Istream;
|
||||||
class Ostream;
|
class Ostream;
|
||||||
|
|
||||||
template<unsigned nBits>
|
template<unsigned Width>
|
||||||
Istream& operator>>(Istream& is, PackedList<nBits>& lst);
|
Istream& operator>>(Istream& is, PackedList<Width>& list);
|
||||||
template<unsigned nBits>
|
|
||||||
Ostream& operator<<(Ostream& os, const PackedList<nBits>& lst);
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Ostream& operator<<(Ostream& os, const PackedList<Width>& list);
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
template<unsigned Width>
|
||||||
Class PackedListCore Declaration
|
Ostream& operator<<(Ostream& os, const InfoProxy<PackedList<Width>>& info);
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
//- Template-invariant bits for PackedList
|
|
||||||
struct PackedListCore
|
|
||||||
{
|
|
||||||
//- Construct null
|
|
||||||
PackedListCore()
|
|
||||||
{}
|
|
||||||
|
|
||||||
//- Define template name and debug
|
|
||||||
ClassName("PackedList");
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class PackedList Declaration
|
Class PackedList Declaration
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
template<unsigned nBits=1>
|
template<unsigned Width>
|
||||||
class PackedList
|
class PackedList
|
||||||
:
|
:
|
||||||
public PackedListCore,
|
public Detail::PackedListCore
|
||||||
private List<unsigned int>
|
|
||||||
{
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Types and dimension information
|
||||||
|
|
||||||
|
//- The storage block type for bit elements
|
||||||
|
typedef unsigned int block_type;
|
||||||
|
|
||||||
|
//- The number of bits in a single block
|
||||||
|
static constexpr unsigned bits_per_block
|
||||||
|
= (std::numeric_limits<block_type>::digits);
|
||||||
|
|
||||||
|
//- The width of an individual element (in bits).
|
||||||
|
static constexpr unsigned element_width = (Width);
|
||||||
|
|
||||||
|
//- The number of elements stored per data block.
|
||||||
|
static constexpr unsigned elem_per_block = (bits_per_block / Width);
|
||||||
|
|
||||||
|
//- The max value for an element which is also the bit-mask of the
|
||||||
|
//- individual element.
|
||||||
|
// Eg, for Width=2: ((1 << 2) - 1) == 0b0011
|
||||||
|
static constexpr block_type max_value = ((1u << Width) - 1);
|
||||||
|
|
||||||
|
//- Calculate the number of blocks required to _address_ the
|
||||||
|
//- requested number of elements.
|
||||||
|
//
|
||||||
|
// We calculate this:
|
||||||
|
// \code
|
||||||
|
// (numElem / elem_per_block)
|
||||||
|
// + (numElem % elem_per_block) ? 1 : 0
|
||||||
|
// \code
|
||||||
|
// But avoiding the modulus operation
|
||||||
|
static constexpr label num_blocks(label numElem)
|
||||||
|
{
|
||||||
|
return ((numElem - 1 + elem_per_block) / elem_per_block);
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Masking for all bits below the element offset.
|
||||||
|
// Ill-defined when elementOffset is out of range.
|
||||||
|
static constexpr block_type mask_lower(unsigned elementOffset)
|
||||||
|
{
|
||||||
|
return (~0u >> (bits_per_block - Width * elementOffset));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
typedef unsigned int StorageType;
|
// Protected Data
|
||||||
typedef List<StorageType> StorageList;
|
|
||||||
|
//- The internal container for storing the blocks
|
||||||
|
typedef List<block_type> block_container;
|
||||||
|
|
||||||
|
//- The blocks of raw data
|
||||||
|
block_container blocks_;
|
||||||
|
|
||||||
|
//- Number of entries used
|
||||||
|
label size_;
|
||||||
|
|
||||||
|
//- Enforce non-zero Width to fit within the block storage and require
|
||||||
|
//- at least 2 items per storage block for general efficiency.
|
||||||
|
//
|
||||||
|
// Thus 1/2 of the base storage size is (sizeof(block_type)*8/2),
|
||||||
|
// or (sizeof(block_type) << 2)
|
||||||
|
static_assert
|
||||||
|
(
|
||||||
|
Width && Width <= (sizeof(block_type) << 2),
|
||||||
|
"Width must be > 0 and minimum of two items per data block"
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
// Protected Member Functions
|
// Protected Member Functions
|
||||||
|
|
||||||
//- Calculate the list length when packed
|
//- A fill value for complete blocks
|
||||||
inline static constexpr label packedLength(const label nElem);
|
inline static unsigned int repeated_value(unsigned val);
|
||||||
|
|
||||||
//- Read a list entry (allows for specialization)
|
//- Read a list entry (allows for specialization)
|
||||||
inline static unsigned int readValue(Istream& is);
|
inline static unsigned int readValue(Istream& is);
|
||||||
@ -138,33 +207,13 @@ protected:
|
|||||||
// For bool specialization, read a single index value
|
// For bool specialization, read a single index value
|
||||||
inline void setPair(Istream& is);
|
inline void setPair(Istream& is);
|
||||||
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//- nBits must be positive (non-zero) and fit within the storage.
|
|
||||||
// For efficiency, however, require packing at least 2 items otherwise
|
|
||||||
// it is more efficient to use a normal list.
|
|
||||||
// Thus max nBits is 1/2 of the base storage size.
|
|
||||||
// For simplicity, assume 8-bit bytes in the assert.
|
|
||||||
static_assert
|
|
||||||
(
|
|
||||||
nBits && nBits <= (sizeof(StorageType) << 2),
|
|
||||||
"nBits must be positive (non-zero) and fit within the storage"
|
|
||||||
);
|
|
||||||
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Number of nBits entries
|
|
||||||
label size_;
|
|
||||||
|
|
||||||
|
|
||||||
protected:
|
|
||||||
|
|
||||||
// Protected Member Functions
|
|
||||||
|
|
||||||
//- Write as a dictionary entry
|
//- Write as a dictionary entry
|
||||||
void writeEntry(Ostream& os) const;
|
void writeEntry(Ostream& os) const;
|
||||||
|
|
||||||
|
//- Clear any partial rubbish in the last addressable block
|
||||||
|
// This \a rubbish may have arisen from block-wise operations etc.
|
||||||
|
inline void clear_trailing_bits();
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
@ -174,129 +223,93 @@ public:
|
|||||||
typedef unsigned int const_reference;
|
typedef unsigned int const_reference;
|
||||||
|
|
||||||
|
|
||||||
// Public data
|
|
||||||
|
|
||||||
//- The max. number of bits that can be templated.
|
|
||||||
// Might someday be useful for a template assert.
|
|
||||||
inline static constexpr unsigned int max_bits();
|
|
||||||
|
|
||||||
//- The max. value for an entry, which simultaneously the bit-mask
|
|
||||||
// eg, ((1 << 2) - 1) yields 0b0011
|
|
||||||
inline static constexpr unsigned int max_value();
|
|
||||||
|
|
||||||
//- The number of entries per packed storage element
|
|
||||||
inline static constexpr unsigned int packing();
|
|
||||||
|
|
||||||
//- Masking for all bits below the offset
|
|
||||||
inline static constexpr unsigned int maskLower(unsigned offset);
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
//- Null constructor
|
//- Null constructor
|
||||||
inline PackedList();
|
inline constexpr PackedList() noexcept;
|
||||||
|
|
||||||
//- Construct with given size, initializes list to 0
|
//- Construct for given number of elements, initializes values to 0
|
||||||
explicit inline PackedList(const label size);
|
explicit inline PackedList(const label numElem);
|
||||||
|
|
||||||
//- Construct with given size and value for all elements
|
//- Construct for given number of elements, and the specified
|
||||||
inline PackedList(const label size, const unsigned val);
|
//- value for each element
|
||||||
|
inline PackedList(const label numElem, const unsigned int val);
|
||||||
|
|
||||||
//- Construct from Istream
|
//- Construct from Istream
|
||||||
inline PackedList(Istream& is);
|
inline PackedList(Istream& is);
|
||||||
|
|
||||||
//- Copy construct
|
//- Copy construct
|
||||||
inline PackedList(const PackedList<nBits>& lst);
|
inline PackedList(const PackedList<Width>& rhs);
|
||||||
|
|
||||||
//- Move construct
|
//- Move construct
|
||||||
inline PackedList(PackedList<nBits>&& lst);
|
inline PackedList(PackedList<Width>&& rhs);
|
||||||
|
|
||||||
//- Construct from a list of labels
|
//- Construct from a list of values
|
||||||
explicit inline PackedList(const labelUList& lst);
|
explicit inline PackedList(const labelUList& values);
|
||||||
|
|
||||||
//- Construct from an indirect list of labels
|
//- Construct from a list of values
|
||||||
explicit inline PackedList(const labelUIndList& lst);
|
explicit inline PackedList(const labelUIndList& values);
|
||||||
|
|
||||||
//- Clone
|
//- Clone
|
||||||
inline autoPtr<PackedList<nBits>> clone() const;
|
inline autoPtr<PackedList<Width>> clone() const;
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
// Member Functions
|
||||||
|
|
||||||
// Access
|
// Query
|
||||||
|
|
||||||
//- The number of elements that can be stored before reallocating
|
|
||||||
inline label capacity() const;
|
|
||||||
|
|
||||||
//- Number of entries.
|
|
||||||
inline label size() const;
|
|
||||||
|
|
||||||
//- Return true if the list is empty (ie, size() is zero).
|
|
||||||
inline bool empty() const;
|
|
||||||
|
|
||||||
//- Get value at index I.
|
|
||||||
// Never auto-vivify entries.
|
|
||||||
inline unsigned int get(const label i) const;
|
|
||||||
|
|
||||||
//- Set value at index I, default value set is the max_value.
|
|
||||||
// Does auto-vivify for non-existent, non-zero entries.
|
|
||||||
// \return true if value changed.
|
|
||||||
inline bool set(const label i, const unsigned int val = ~0u);
|
|
||||||
|
|
||||||
//- Unset the entry at index I.
|
|
||||||
// Never auto-vivify entries.
|
|
||||||
// \return true if value changed.
|
|
||||||
inline bool unset(const label i);
|
|
||||||
|
|
||||||
//- Return the underlying packed storage
|
|
||||||
// Manipulate with utmost caution
|
|
||||||
inline List<unsigned int>& storage();
|
|
||||||
|
|
||||||
//- Return the underlying packed storage
|
|
||||||
inline const List<unsigned int>& storage() const;
|
|
||||||
|
|
||||||
//- The list length when packed
|
|
||||||
inline label packedLength() const;
|
|
||||||
|
|
||||||
//- The number of bytes used in the underlying storage
|
|
||||||
inline std::streamsize byteSize() const;
|
|
||||||
|
|
||||||
//- Count number of bits set, O(log(n))
|
|
||||||
// Uses the Hamming weight (population count) method
|
|
||||||
// http://en.wikipedia.org/wiki/Hamming_weight
|
|
||||||
unsigned int count() const;
|
|
||||||
|
|
||||||
//- Return the values as a list of labels
|
|
||||||
labelList values() const;
|
|
||||||
|
|
||||||
//- Print bit patterns, optionally output unused elements
|
|
||||||
//
|
|
||||||
// addressable bits:
|
|
||||||
// on: '1', off: '-'
|
|
||||||
//
|
|
||||||
// non-addressable bits:
|
|
||||||
// on: '!', off: '.'
|
|
||||||
//
|
|
||||||
Ostream& printBits(Ostream& os, const bool fullOutput=false) const;
|
|
||||||
|
|
||||||
//- Print information and bit patterns (with printBits)
|
|
||||||
Ostream& printInfo(Ostream& os, const bool fullOutput=false) const;
|
|
||||||
|
|
||||||
// Check
|
|
||||||
|
|
||||||
//- Check index is within valid range [0,size)
|
//- Check index is within valid range [0,size)
|
||||||
inline void checkIndex(const label i) const;
|
inline void checkIndex(const label i) const;
|
||||||
|
|
||||||
|
//- Number of entries.
|
||||||
|
inline label size() const noexcept;
|
||||||
|
|
||||||
|
//- Return true if the list is empty (ie, size() is zero).
|
||||||
|
inline bool empty() const noexcept;
|
||||||
|
|
||||||
|
//- The number of elements that can be stored with reallocating
|
||||||
|
inline label capacity() const;
|
||||||
|
|
||||||
|
//- True if there are two or more entries and all entries have
|
||||||
|
//- identical values.
|
||||||
|
bool uniform() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Access
|
||||||
|
|
||||||
|
//- Get value at index i or 0 for out-of-range.
|
||||||
|
// Never auto-vivify entries.
|
||||||
|
inline unsigned int get(const label i) const;
|
||||||
|
|
||||||
|
//- Set value at index i, default value set is the max_value.
|
||||||
|
// Does auto-vivify for non-existent, non-zero entries.
|
||||||
|
// \return true if value changed.
|
||||||
|
inline bool set(const label i, unsigned int val = ~0u);
|
||||||
|
|
||||||
|
//- Unset the entry at index i.
|
||||||
|
// Never auto-vivify entries.
|
||||||
|
// \return true if the value changed.
|
||||||
|
inline bool unset(const label i);
|
||||||
|
|
||||||
|
//- Return the values as a list of labels
|
||||||
|
labelList values() const;
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
//- Trim any trailing zero elements
|
//- Assign all entries to the given value. Takes linear time.
|
||||||
bool trim();
|
inline void assign(const unsigned int val);
|
||||||
|
|
||||||
//- Invert the bits in the addressable region
|
//- Copy assignment.
|
||||||
void flip();
|
inline void assign(const PackedList<Width>& rhs);
|
||||||
|
|
||||||
//- Clear all bits
|
//- Trim any trailing zero elements, optionally specifying a
|
||||||
|
//- a minimum position, below which trimming will not occur.
|
||||||
|
//
|
||||||
|
// \return true if trimming changed the size.
|
||||||
|
inline bool trim(label minpos=-1);
|
||||||
|
|
||||||
|
//- Clear all bits but do not adjust the addressable size.
|
||||||
inline void reset();
|
inline void reset();
|
||||||
|
|
||||||
//- Alter the size of the underlying storage.
|
//- Alter the size of the underlying storage.
|
||||||
@ -327,13 +340,36 @@ public:
|
|||||||
//- Shrink the allocated space to what is actually used.
|
//- Shrink the allocated space to what is actually used.
|
||||||
inline void shrink();
|
inline void shrink();
|
||||||
|
|
||||||
|
//- Swap contents with argument
|
||||||
|
inline void swap(PackedList<Width>& rhs);
|
||||||
|
|
||||||
//- Transfer the contents of the argument list into this list
|
//- Transfer the contents of the argument list into this list
|
||||||
// and annul the argument list.
|
// and annul the argument list.
|
||||||
inline void transfer(PackedList<nBits>& lst);
|
inline void transfer(PackedList<Width>& rhs);
|
||||||
|
|
||||||
|
|
||||||
|
// Low-level access
|
||||||
|
|
||||||
|
//- The number of bytes used in the underlying storage
|
||||||
|
//- including any unused padding.
|
||||||
|
inline std::streamsize byteSize() const;
|
||||||
|
|
||||||
|
//- The number of internal storage blocks
|
||||||
|
inline label nBlocks() const;
|
||||||
|
|
||||||
|
//- Return the underlying storage blocks
|
||||||
|
inline const List<unsigned int>& storage() const;
|
||||||
|
|
||||||
|
//- Return the underlying storage blocks
|
||||||
|
// Manipulate with utmost caution
|
||||||
|
inline List<unsigned int>& storage();
|
||||||
|
|
||||||
|
|
||||||
// IO
|
// IO
|
||||||
|
|
||||||
|
//- Print bit patterns, optionally with extra debug
|
||||||
|
Ostream& printBits(Ostream& os, bool debugOutput=false) const;
|
||||||
|
|
||||||
//- Clear list and read from stream
|
//- Clear list and read from stream
|
||||||
Istream& read(Istream& is);
|
Istream& read(Istream& is);
|
||||||
|
|
||||||
@ -349,7 +385,7 @@ public:
|
|||||||
// Member Operators
|
// Member Operators
|
||||||
|
|
||||||
//- Append a value at the end of the list
|
//- Append a value at the end of the list
|
||||||
inline PackedList<nBits>& append(const unsigned int val);
|
inline PackedList<Width>& append(const unsigned int val);
|
||||||
|
|
||||||
//- Remove and return the last element
|
//- Remove and return the last element
|
||||||
inline unsigned int remove();
|
inline unsigned int remove();
|
||||||
@ -366,32 +402,30 @@ public:
|
|||||||
inline void operator=(const unsigned int val);
|
inline void operator=(const unsigned int val);
|
||||||
|
|
||||||
//- Copy assignment.
|
//- Copy assignment.
|
||||||
void operator=(const PackedList<nBits>& lst);
|
inline void operator=(const PackedList<Width>& lst);
|
||||||
|
|
||||||
//- Move assignment.
|
//- Move assignment.
|
||||||
void operator=(PackedList<nBits>&& lst);
|
inline void operator=(PackedList<Width>&& lst);
|
||||||
|
|
||||||
//- Assignment operator.
|
|
||||||
void operator=(const labelUList& lst);
|
|
||||||
|
|
||||||
//- Assignment operator.
|
|
||||||
void operator=(const labelUIndList& lst);
|
|
||||||
|
|
||||||
|
|
||||||
// Iterators and helpers
|
// Access helpers
|
||||||
|
|
||||||
//- A reference for read/write access to an entry
|
//- A reference supporting read/write access to an entry
|
||||||
class reference
|
class reference
|
||||||
{
|
{
|
||||||
friend class PackedList; // Access for PackedList
|
protected:
|
||||||
|
friend class PackedList; // Access for parent
|
||||||
void operator&() = delete; // Refuse to provide its address
|
void operator&() = delete; // Refuse to provide its address
|
||||||
|
|
||||||
unsigned int& ref_; //!< Reference to underlying block value
|
//- Reference to the block
|
||||||
unsigned int shift_; //!< The bit shift for the sub-portion
|
block_type& ref_;
|
||||||
|
|
||||||
//- Construct by taking reference of block from within the list
|
//- The bit shift to access the given sub-portion
|
||||||
//- at the specified index.
|
unsigned shift_;
|
||||||
inline reference(PackedList* lst, const label index);
|
|
||||||
|
//- Construct by taking reference of block from within
|
||||||
|
//- the list and the specified index.
|
||||||
|
inline reference(PackedList* parent, const label index);
|
||||||
|
|
||||||
//- Get value as unsigned, no range-checking
|
//- Get value as unsigned, no range-checking
|
||||||
inline unsigned int get() const;
|
inline unsigned int get() const;
|
||||||
@ -404,27 +438,40 @@ public:
|
|||||||
//- Value assignment
|
//- Value assignment
|
||||||
inline void operator=(const reference& other);
|
inline void operator=(const reference& other);
|
||||||
|
|
||||||
//- Value assignment
|
//- Value assignment.
|
||||||
inline void operator=(const unsigned int val);
|
inline void operator=(const unsigned int val);
|
||||||
|
|
||||||
//- Conversion operator
|
//- Conversion operator.
|
||||||
inline operator unsigned int () const;
|
inline operator unsigned int () const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// IOstream Operators
|
// IOstream Operators
|
||||||
|
|
||||||
friend Istream& operator>> <nBits>
|
//- Return info proxy.
|
||||||
(
|
InfoProxy<PackedList<Width>> info() const
|
||||||
Istream& is,
|
{
|
||||||
PackedList<nBits>& lst
|
return *this;
|
||||||
);
|
}
|
||||||
|
|
||||||
friend Ostream& operator<< <nBits>
|
friend Ostream& operator<< <Width>
|
||||||
(
|
(
|
||||||
Ostream& os,
|
Ostream& os,
|
||||||
const PackedList<nBits>& lst
|
const InfoProxy<PackedList<Width>>& info
|
||||||
);
|
);
|
||||||
|
|
||||||
|
friend Istream& operator>> <Width>
|
||||||
|
(
|
||||||
|
Istream& is,
|
||||||
|
PackedList<Width>& list
|
||||||
|
);
|
||||||
|
|
||||||
|
friend Ostream& operator<< <Width>
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const PackedList<Width>& list
|
||||||
|
);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -440,6 +487,7 @@ public:
|
|||||||
|
|
||||||
#ifdef NoRepository
|
#ifdef NoRepository
|
||||||
#include "PackedList.C"
|
#include "PackedList.C"
|
||||||
|
#include "PackedListIO.C"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -2,7 +2,7 @@
|
|||||||
========= |
|
========= |
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
\\ / O peration |
|
\\ / O peration |
|
||||||
\\ / A nd | Copyright (C) 2011-2012 OpenFOAM Foundation
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
@ -23,14 +23,16 @@ License
|
|||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "PackedList.H"
|
#include "PackedListCore.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
defineTypeNameAndDebug(PackedListCore, 0);
|
namespace Detail
|
||||||
|
{
|
||||||
|
defineTypeName(PackedListCore);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
67
src/OpenFOAM/containers/Bits/PackedList/PackedListCore.H
Normal file
67
src/OpenFOAM/containers/Bits/PackedList/PackedListCore.H
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::Detail::PackedListCore
|
||||||
|
|
||||||
|
Description
|
||||||
|
Implementation of template-invariant details for Foam::PackedList
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
PackedListCore.C
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef PackedListCore_H
|
||||||
|
#define PackedListCore_H
|
||||||
|
|
||||||
|
#include "className.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
namespace Detail
|
||||||
|
{
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class Detail::PackedListCore Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
//- Template-invariant parts for PackedList
|
||||||
|
struct PackedListCore
|
||||||
|
{
|
||||||
|
//- Define template name
|
||||||
|
ClassNameNoDebug("PackedList");
|
||||||
|
};
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Detail
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
753
src/OpenFOAM/containers/Bits/PackedList/PackedListI.H
Normal file
753
src/OpenFOAM/containers/Bits/PackedList/PackedListI.H
Normal file
@ -0,0 +1,753 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
||||||
|
\\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "error.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::repeated_value(unsigned val)
|
||||||
|
{
|
||||||
|
std::cout << "call repeated_value" << nl;
|
||||||
|
return BitOps::repeat_value<block_type,Width>(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::readValue(Istream& is)
|
||||||
|
{
|
||||||
|
const unsigned int val = readLabel(is);
|
||||||
|
|
||||||
|
if (val > max_value)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(is)
|
||||||
|
<< "Out-of-range value " << val << " for PackedList<" << Width
|
||||||
|
<< ">. Maximum permitted value is " << max_value << "."
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::setPair(Istream& is)
|
||||||
|
{
|
||||||
|
is.readBegin("Tuple2<label,uint32>");
|
||||||
|
|
||||||
|
const label ind = readLabel(is);
|
||||||
|
const unsigned int val = readLabel(is);
|
||||||
|
|
||||||
|
is.readEnd("Tuple2<label,uint32>");
|
||||||
|
|
||||||
|
if (val > max_value)
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(is)
|
||||||
|
<< "Out-of-range value " << val << " for PackedList<" << Width
|
||||||
|
<< "> at index " << ind
|
||||||
|
<< ". Maximum permitted value is " << max_value << "."
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
set(ind, val);
|
||||||
|
|
||||||
|
is.check(FUNCTION_NAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::clear_trailing_bits()
|
||||||
|
{
|
||||||
|
// Mask off any partial rubbish in final block
|
||||||
|
const unsigned int blk = size() / elem_per_block;
|
||||||
|
const unsigned int off = size() % elem_per_block;
|
||||||
|
|
||||||
|
if (off)
|
||||||
|
{
|
||||||
|
blocks_[blk] &= mask_lower(off);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline bool Foam::PackedList<Width>::trim(label minpos)
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
{
|
||||||
|
return false; // Trivial case
|
||||||
|
}
|
||||||
|
|
||||||
|
const label orig = size();
|
||||||
|
if (orig < minpos)
|
||||||
|
{
|
||||||
|
minpos = orig; // Don't allow allow accidental growth!
|
||||||
|
}
|
||||||
|
|
||||||
|
for (label blocki = num_blocks(size())-1; blocki >= 0; --blocki)
|
||||||
|
{
|
||||||
|
// Truncate to the block begin
|
||||||
|
size_ = blocki * elem_per_block;
|
||||||
|
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
|
||||||
|
// Some bits were found in the block, increment size again
|
||||||
|
if (blockval)
|
||||||
|
{
|
||||||
|
for (; blockval; ++size_)
|
||||||
|
{
|
||||||
|
blockval >>= Width;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (size_ < minpos)
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size_ < minpos)
|
||||||
|
{
|
||||||
|
size_ = minpos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (size() != orig);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Specializations * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
template<> inline unsigned int PackedList<1>::repeated_value(unsigned val)
|
||||||
|
{
|
||||||
|
return (val ? ~0u : 0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> inline unsigned int PackedList<1>::readValue(Istream& is)
|
||||||
|
{
|
||||||
|
return readBool(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<> inline void PackedList<1>::setPair(Istream& is)
|
||||||
|
{
|
||||||
|
set(readLabel(is), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline constexpr Foam::PackedList<Width>::PackedList() noexcept
|
||||||
|
:
|
||||||
|
blocks_(),
|
||||||
|
size_(0)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(const label numElem)
|
||||||
|
:
|
||||||
|
blocks_(num_blocks(numElem), 0u),
|
||||||
|
size_(numElem)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList
|
||||||
|
(
|
||||||
|
const label numElem,
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
:
|
||||||
|
blocks_(num_blocks(numElem), 0u),
|
||||||
|
size_(numElem)
|
||||||
|
{
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
operator=(val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(Istream& is)
|
||||||
|
:
|
||||||
|
blocks_(),
|
||||||
|
size_(0)
|
||||||
|
{
|
||||||
|
read(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(const PackedList<Width>& rhs)
|
||||||
|
:
|
||||||
|
blocks_(rhs.blocks_),
|
||||||
|
size_(rhs.size_)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(PackedList<Width>&& rhs)
|
||||||
|
:
|
||||||
|
blocks_(std::move(rhs.blocks_)),
|
||||||
|
size_(rhs.size_)
|
||||||
|
{
|
||||||
|
rhs.size_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(const labelUList& values)
|
||||||
|
:
|
||||||
|
blocks_(num_blocks(values.size()), 0u),
|
||||||
|
size_(values.size())
|
||||||
|
{
|
||||||
|
const label len = values.size();
|
||||||
|
|
||||||
|
// Could add more intelligent filling (blockwise), but likely done
|
||||||
|
// fairly infrequently
|
||||||
|
|
||||||
|
for (label i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
const unsigned int val(values[i]);
|
||||||
|
if (val) set(i, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::PackedList(const labelUIndList& values)
|
||||||
|
:
|
||||||
|
blocks_(num_blocks(values.size()), 0u),
|
||||||
|
size_(values.size())
|
||||||
|
{
|
||||||
|
const label len = values.size();
|
||||||
|
|
||||||
|
// Could add more intelligent filling (blockwise), but likely done
|
||||||
|
// fairly infrequently
|
||||||
|
|
||||||
|
for (label i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
const unsigned int val(values[i]);
|
||||||
|
if (val) set(i, val);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::autoPtr<Foam::PackedList<Width>>
|
||||||
|
Foam::PackedList<Width>::clone() const
|
||||||
|
{
|
||||||
|
return autoPtr<PackedList<Width>>::New(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * References * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::reference::reference
|
||||||
|
(
|
||||||
|
PackedList<Width>* parent,
|
||||||
|
const label index
|
||||||
|
)
|
||||||
|
:
|
||||||
|
ref_(parent->blocks_[index / elem_per_block]),
|
||||||
|
shift_(Width * (index % elem_per_block))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::reference::get() const
|
||||||
|
{
|
||||||
|
return ((ref_ >> shift_) & max_value);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline bool Foam::PackedList<Width>::reference::set(const unsigned int val)
|
||||||
|
{
|
||||||
|
const unsigned int mask = (max_value << shift_);
|
||||||
|
const unsigned int prev = ref_;
|
||||||
|
|
||||||
|
if (val >= max_value)
|
||||||
|
{
|
||||||
|
ref_ |= mask; // Overflow is max_value, so fill entirely
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ref_ &= ~mask;
|
||||||
|
ref_ |= mask & (val << shift_);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (prev != ref_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::reference::operator=
|
||||||
|
(
|
||||||
|
const reference& other
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this->set(other.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::reference::operator=
|
||||||
|
(
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this->set(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>::reference::operator unsigned int () const
|
||||||
|
{
|
||||||
|
return this->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::checkIndex(const label i) const
|
||||||
|
{
|
||||||
|
if (!size_)
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "attempt to access element " << i << " from zero sized list"
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
else if (i < 0 || i >= size_)
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "index " << i << " out of range [0," << size_ << ")"
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::label Foam::PackedList<Width>::size() const noexcept
|
||||||
|
{
|
||||||
|
return size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline bool Foam::PackedList<Width>::empty() const noexcept
|
||||||
|
{
|
||||||
|
return !size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::label Foam::PackedList<Width>::capacity() const
|
||||||
|
{
|
||||||
|
return elem_per_block * blocks_.size();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::resize
|
||||||
|
(
|
||||||
|
const label newSize,
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
reserve(newSize);
|
||||||
|
|
||||||
|
const label oldSize = size();
|
||||||
|
size_ = newSize;
|
||||||
|
|
||||||
|
if (oldSize < size())
|
||||||
|
{
|
||||||
|
// Fill new elements or newly exposed elements
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
// Fill value for complete blocks
|
||||||
|
const unsigned int blockval = repeated_value(val);
|
||||||
|
|
||||||
|
// Fill complete blocks
|
||||||
|
const label oldLen = num_blocks(oldSize);
|
||||||
|
const label newLen = num_blocks(size());
|
||||||
|
for (label blocki = oldLen; blocki < newLen; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = blockval;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Finish previous partial block, preserve existing value
|
||||||
|
{
|
||||||
|
const unsigned int blk = oldSize / elem_per_block;
|
||||||
|
const unsigned int off = oldSize % elem_per_block;
|
||||||
|
if (off)
|
||||||
|
{
|
||||||
|
const unsigned int mask = mask_lower(off);
|
||||||
|
|
||||||
|
blocks_[blk] &= mask;
|
||||||
|
blocks_[blk] |= ~mask & blockval;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (size() < oldSize)
|
||||||
|
{
|
||||||
|
// The list is now shorter than before, so we zero assign the unused
|
||||||
|
// blocks and any trailing junk. This costs slightly here, but make
|
||||||
|
// things much simpler elsewhere.
|
||||||
|
|
||||||
|
// Clear complete blocks
|
||||||
|
const label oldLen = num_blocks(oldSize);
|
||||||
|
const label newLen = num_blocks(size());
|
||||||
|
for (label blocki = newLen; blocki < oldLen; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = 0u;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::setSize
|
||||||
|
(
|
||||||
|
const label newSize,
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
resize(newSize, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::setCapacity(const label numElem)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(numElem);
|
||||||
|
|
||||||
|
blocks_.resize(nblocks, 0u);
|
||||||
|
|
||||||
|
if (numElem < size())
|
||||||
|
{
|
||||||
|
size_ = numElem;
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::reserve(const label numElem)
|
||||||
|
{
|
||||||
|
const label oldLen = blocks_.size();
|
||||||
|
const label newLen = num_blocks(numElem);
|
||||||
|
|
||||||
|
// Allocate more capacity if necessary
|
||||||
|
if (oldLen < newLen)
|
||||||
|
{
|
||||||
|
blocks_.resize
|
||||||
|
(
|
||||||
|
// SizeMin=16, allocation doubling
|
||||||
|
max(16, max(newLen, 2*oldLen)),
|
||||||
|
0u
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::reset()
|
||||||
|
{
|
||||||
|
blocks_ = 0u;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::clear()
|
||||||
|
{
|
||||||
|
reset();
|
||||||
|
size_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::clearStorage()
|
||||||
|
{
|
||||||
|
blocks_.clear();
|
||||||
|
size_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::shrink()
|
||||||
|
{
|
||||||
|
// Any unneeded space allocated?
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
if (nblocks < blocks_.size())
|
||||||
|
{
|
||||||
|
blocks_.resize(nblocks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::List<unsigned int>& Foam::PackedList<Width>::storage()
|
||||||
|
{
|
||||||
|
return blocks_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline const Foam::List<unsigned int>& Foam::PackedList<Width>::storage() const
|
||||||
|
{
|
||||||
|
return blocks_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::label Foam::PackedList<Width>::nBlocks() const
|
||||||
|
{
|
||||||
|
return num_blocks(size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline std::streamsize Foam::PackedList<Width>::byteSize() const
|
||||||
|
{
|
||||||
|
return num_blocks(size()) * sizeof(block_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::swap(PackedList<Width>& rhs)
|
||||||
|
{
|
||||||
|
blocks_.swap(rhs.blocks_);
|
||||||
|
Foam::Swap(size_, rhs.size_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::transfer(PackedList<Width>& rhs)
|
||||||
|
{
|
||||||
|
blocks_.transfer(rhs.blocks_);
|
||||||
|
|
||||||
|
size_ = rhs.size_;
|
||||||
|
rhs.size_ = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::get(const label i) const
|
||||||
|
{
|
||||||
|
if (i < 0 || i >= size())
|
||||||
|
{
|
||||||
|
#ifdef FULLDEBUG
|
||||||
|
if (i < 0)
|
||||||
|
{
|
||||||
|
WarningInFunction
|
||||||
|
<< "Ignoring attempt to get a negative index " << i
|
||||||
|
<< " range is [0," << size_ << ")"
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Lazy evaluation - return 0 for out-of-range
|
||||||
|
return 0u;
|
||||||
|
}
|
||||||
|
|
||||||
|
return reference(const_cast<PackedList<Width>*>(this), i).get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline bool Foam::PackedList<Width>::set
|
||||||
|
(
|
||||||
|
const label i,
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (i < 0)
|
||||||
|
{
|
||||||
|
#ifdef FULLDEBUG
|
||||||
|
WarningInFunction
|
||||||
|
<< "Ignoring attempt to set a negative index " << i
|
||||||
|
<< " range is [0," << size_ << ")"
|
||||||
|
<< endl;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Lazy evaluation - ignore out-of-bounds
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else if (i >= size())
|
||||||
|
{
|
||||||
|
if (!val)
|
||||||
|
{
|
||||||
|
// Same as unset out-of-bounds = noop
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Lazy evaluation - increase size on assigment
|
||||||
|
resize(i + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return reference(this, i).set(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline bool Foam::PackedList<Width>::unset(const label i)
|
||||||
|
{
|
||||||
|
if (i < 0 || i >= size())
|
||||||
|
{
|
||||||
|
// Unset out-of-bounds = noop
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return reference(this, i).set(0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline Foam::PackedList<Width>&
|
||||||
|
Foam::PackedList<Width>::append(const unsigned int val)
|
||||||
|
{
|
||||||
|
const label idx = size();
|
||||||
|
reserve(idx + 1);
|
||||||
|
++size_;
|
||||||
|
|
||||||
|
reference(this, idx).set(val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::remove()
|
||||||
|
{
|
||||||
|
// Location of last element and simultaneously the new size
|
||||||
|
const label idx = size()-1;
|
||||||
|
|
||||||
|
if (idx < 0)
|
||||||
|
{
|
||||||
|
FatalErrorInFunction
|
||||||
|
<< "List is empty" << abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
const unsigned int old = reference(this, idx).get();
|
||||||
|
resize(idx);
|
||||||
|
|
||||||
|
return old;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::assign(const unsigned int val)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
// Trivial cases first
|
||||||
|
if (!nblocks)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if (!val)
|
||||||
|
{
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = 0u;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill value for complete blocks
|
||||||
|
const unsigned int blockval = repeated_value(val);
|
||||||
|
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = blockval;
|
||||||
|
}
|
||||||
|
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::assign(const PackedList<Width>& list)
|
||||||
|
{
|
||||||
|
blocks_ = list.blocks_;
|
||||||
|
size_ = list.size_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline unsigned int Foam::PackedList<Width>::operator[](const label i) const
|
||||||
|
{
|
||||||
|
return get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline typename Foam::PackedList<Width>::reference
|
||||||
|
Foam::PackedList<Width>::operator[](const label i)
|
||||||
|
{
|
||||||
|
// Leave enabled during testing period (MAR-2018)
|
||||||
|
// #ifdef FULLDEBUG
|
||||||
|
checkIndex(i);
|
||||||
|
// #endif
|
||||||
|
return reference(this, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::operator=(const unsigned int val)
|
||||||
|
{
|
||||||
|
assign(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::operator=(const PackedList<Width>& rhs)
|
||||||
|
{
|
||||||
|
assign(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
inline void Foam::PackedList<Width>::operator=(PackedList<Width>&& rhs)
|
||||||
|
{
|
||||||
|
transfer(rhs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
314
src/OpenFOAM/containers/Bits/PackedList/PackedListIO.C
Normal file
314
src/OpenFOAM/containers/Bits/PackedList/PackedListIO.C
Normal file
@ -0,0 +1,314 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "PackedList.H"
|
||||||
|
#include "IOstreams.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
void Foam::PackedList<Width>::writeEntry(Ostream& os) const
|
||||||
|
{
|
||||||
|
os << *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Ostream& Foam::PackedList<Width>::printBits
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
bool debugOutput
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
os << token::BEGIN_LIST << nl;
|
||||||
|
|
||||||
|
const label nblocks = debugOutput ? blocks_.size() : num_blocks(size());
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
BitOps::print(os, blocks_[blocki], '.') << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
os << token::END_LIST << nl;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Istream& Foam::PackedList<Width>::read(Istream& is)
|
||||||
|
{
|
||||||
|
PackedList<Width>& list = *this;
|
||||||
|
|
||||||
|
list.clear();
|
||||||
|
is.fatalCheck(FUNCTION_NAME);
|
||||||
|
|
||||||
|
token firstTok(is);
|
||||||
|
is.fatalCheck
|
||||||
|
(
|
||||||
|
"PackedList::read(Istream&) : "
|
||||||
|
"reading first token"
|
||||||
|
);
|
||||||
|
|
||||||
|
if (firstTok.isLabel())
|
||||||
|
{
|
||||||
|
const label len = firstTok.labelToken();
|
||||||
|
|
||||||
|
// Set list length to that read
|
||||||
|
list.resize(len);
|
||||||
|
|
||||||
|
// Read list contents depending on data format
|
||||||
|
if (is.format() == IOstream::ASCII)
|
||||||
|
{
|
||||||
|
// Read beginning of contents
|
||||||
|
const char delimiter = is.readBeginList("PackedList");
|
||||||
|
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
if (delimiter == token::BEGIN_LIST)
|
||||||
|
{
|
||||||
|
for (label i=0; i<len; ++i)
|
||||||
|
{
|
||||||
|
list[i] = list.readValue(is);
|
||||||
|
|
||||||
|
is.fatalCheck
|
||||||
|
(
|
||||||
|
"PackedList::read(Istream&) : "
|
||||||
|
"reading entry"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (delimiter == token::BEGIN_BLOCK)
|
||||||
|
{
|
||||||
|
// Assign for all entries
|
||||||
|
list = list.readValue(is);
|
||||||
|
|
||||||
|
is.fatalCheck
|
||||||
|
(
|
||||||
|
"PackedList::read(Istream&) : "
|
||||||
|
"reading the single entry"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(is)
|
||||||
|
<< "incorrect list token, expected '(' or '{', found "
|
||||||
|
<< firstTok.info()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read end of contents
|
||||||
|
is.readEndList("PackedList");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
is.read
|
||||||
|
(
|
||||||
|
reinterpret_cast<char*>(list.storage().data()),
|
||||||
|
list.byteSize()
|
||||||
|
);
|
||||||
|
|
||||||
|
is.fatalCheck
|
||||||
|
(
|
||||||
|
"PackedList::read(Istream&) : "
|
||||||
|
"reading the binary block"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (firstTok.isPunctuation())
|
||||||
|
{
|
||||||
|
if (firstTok.pToken() == token::BEGIN_LIST)
|
||||||
|
{
|
||||||
|
token nextTok(is);
|
||||||
|
is.fatalCheck(FUNCTION_NAME);
|
||||||
|
|
||||||
|
while
|
||||||
|
(
|
||||||
|
!( nextTok.isPunctuation()
|
||||||
|
&& nextTok.pToken() == token::END_LIST
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
is.putBack(nextTok);
|
||||||
|
list.append(list.readValue(is));
|
||||||
|
|
||||||
|
is >> nextTok;
|
||||||
|
is.fatalCheck(FUNCTION_NAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (firstTok.pToken() == token::BEGIN_BLOCK)
|
||||||
|
{
|
||||||
|
token nextTok(is);
|
||||||
|
is.fatalCheck(FUNCTION_NAME);
|
||||||
|
|
||||||
|
while
|
||||||
|
(
|
||||||
|
!( nextTok.isPunctuation()
|
||||||
|
&& nextTok.pToken() == token::END_BLOCK
|
||||||
|
)
|
||||||
|
)
|
||||||
|
{
|
||||||
|
is.putBack(nextTok);
|
||||||
|
list.setPair(is);
|
||||||
|
|
||||||
|
is >> nextTok;
|
||||||
|
is.fatalCheck(FUNCTION_NAME);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(is)
|
||||||
|
<< "incorrect first token, expected '(', found "
|
||||||
|
<< firstTok.info()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FatalIOErrorInFunction(is)
|
||||||
|
<< "incorrect first token, expected <int>, '(' or '{', found "
|
||||||
|
<< firstTok.info()
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Ostream& Foam::PackedList<Width>::writeList
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const label shortListLen
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const PackedList<Width>& list = *this;
|
||||||
|
const label len = list.size();
|
||||||
|
|
||||||
|
// Write list contents depending on data format
|
||||||
|
if (os.format() == IOstream::ASCII)
|
||||||
|
{
|
||||||
|
if (list.uniform())
|
||||||
|
{
|
||||||
|
// Two or more entries, and all entries have identical values.
|
||||||
|
os << len << token::BEGIN_BLOCK << list[0] << token::END_BLOCK;
|
||||||
|
}
|
||||||
|
else if (!shortListLen || len <= shortListLen)
|
||||||
|
{
|
||||||
|
// Shorter list, or line-breaks suppressed
|
||||||
|
os << len << token::BEGIN_LIST;
|
||||||
|
for (label i=0; i < len; ++i)
|
||||||
|
{
|
||||||
|
if (i) os << token::SPACE;
|
||||||
|
os << list[i];
|
||||||
|
}
|
||||||
|
os << token::END_LIST;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Longer list
|
||||||
|
os << nl << len << nl << token::BEGIN_LIST << nl;
|
||||||
|
for (label i=0; i < len; ++i)
|
||||||
|
{
|
||||||
|
os << list[i] << nl;
|
||||||
|
}
|
||||||
|
os << token::END_LIST << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Contents are binary and contiguous
|
||||||
|
os << nl << len << nl;
|
||||||
|
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
// write(...) includes surrounding start/end delimiters
|
||||||
|
os.write
|
||||||
|
(
|
||||||
|
reinterpret_cast<const char*>(list.storage().cdata()),
|
||||||
|
list.byteSize()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
void Foam::PackedList<Width>::writeEntry
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
Ostream& os
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
os.writeKeyword(keyword);
|
||||||
|
writeEntry(os);
|
||||||
|
os << token::END_STATEMENT << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Istream& Foam::operator>>(Istream& is, PackedList<Width>& list)
|
||||||
|
{
|
||||||
|
return list.read(is);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const PackedList<Width>& list)
|
||||||
|
{
|
||||||
|
return list.writeList(os, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<unsigned Width>
|
||||||
|
Foam::Ostream& Foam::operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const InfoProxy<PackedList<Width>>& iproxy
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const PackedList<Width>& list = iproxy.t_;
|
||||||
|
|
||||||
|
os << "PackedList<" << Width
|
||||||
|
<< "> size=" << list.size() << "/" << list.capacity()
|
||||||
|
<< " (limits: max=" << PackedList<Width>::max_value
|
||||||
|
<< ", elem_per_block=" << PackedList<Width>::elem_per_block
|
||||||
|
<< ")"
|
||||||
|
<< nl;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
36
src/OpenFOAM/containers/Bits/bitSet/PackedBoolList.H
Normal file
36
src/OpenFOAM/containers/Bits/bitSet/PackedBoolList.H
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM, licensed under GNU General Public License
|
||||||
|
<http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Typedef
|
||||||
|
Foam::PackedBoolList
|
||||||
|
|
||||||
|
Description
|
||||||
|
Compatibility name. Superseded (MAR-2018) by Foam::bitSet
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef PackedBoolList_H
|
||||||
|
#define PackedBoolList_H
|
||||||
|
|
||||||
|
#include "bitSet.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
typedef bitSet PackedBoolList;
|
||||||
|
}
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
569
src/OpenFOAM/containers/Bits/bitSet/bitSet.C
Normal file
569
src/OpenFOAM/containers/Bits/bitSet/bitSet.C
Normal file
@ -0,0 +1,569 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "bitSet.H"
|
||||||
|
#include "labelRange.H"
|
||||||
|
#include "IOstreams.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
defineTypeNameAndDebug(bitSet, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::bitSet& Foam::bitSet::minusEq(const bitSet& other)
|
||||||
|
{
|
||||||
|
if (&other == this)
|
||||||
|
{
|
||||||
|
// Self '-=' : results in clearing all bits
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform -= on self: clears all bits" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
reset();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (empty() || other.empty())
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The operation (on overlapping blocks)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(std::min(size(), other.size()));
|
||||||
|
const auto& rhs = other.blocks_;
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] &= ~rhs[blocki];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::bitSet& Foam::bitSet::andEq(const bitSet& other)
|
||||||
|
{
|
||||||
|
if (&other == this)
|
||||||
|
{
|
||||||
|
// Self '&=' : no-op
|
||||||
|
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform &= on self: ignore" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (empty())
|
||||||
|
{
|
||||||
|
// empty set : no-op (no overlap possible)
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (other.empty())
|
||||||
|
{
|
||||||
|
reset(); // Other is empty - no overlap possible
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The operation (on overlapping blocks)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(std::min(size(), other.size()));
|
||||||
|
const auto& rhs = other.blocks_;
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] &= rhs[blocki];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::bitSet& Foam::bitSet::orEq(const bitSet& other, const bool strict)
|
||||||
|
{
|
||||||
|
if (&other == this)
|
||||||
|
{
|
||||||
|
// Self '|=' : no-op
|
||||||
|
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform |= on self: ignore" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (other.empty())
|
||||||
|
{
|
||||||
|
if ((debug & 2) && !empty())
|
||||||
|
{
|
||||||
|
// OK if both are empty
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform |= using empty operand: ignore" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No (normal) overlap: no-op
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (empty())
|
||||||
|
{
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform |= on empty bitSet" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict)
|
||||||
|
{
|
||||||
|
// No (normal) overlap: no-op
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((debug & 2) && (size() != other.size()))
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform |= on dissimilar sized bitSets: "
|
||||||
|
<< size() << " vs. " << other.size() << nl;
|
||||||
|
}
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
label minpos = -1; // Min trim point
|
||||||
|
|
||||||
|
if ((size() < other.size()) && !strict)
|
||||||
|
{
|
||||||
|
// The size (B > A) and we are non-strict (greedy), which means we may
|
||||||
|
// acquire additional bits from B. However, we would like to avoid
|
||||||
|
// spurious changes in the size of A (ie, B is longer but the extra
|
||||||
|
// bits are unset and thus don't affect the logical result).
|
||||||
|
|
||||||
|
minpos = size();
|
||||||
|
resize(other.size()); // Blocks now overlap
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The operation (on overlapping blocks)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(std::min(size(), other.size()));
|
||||||
|
const auto& rhs = other.blocks_;
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] |= rhs[blocki];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Cleanup - minpos >= 0 means we need to check/adjust the trim point
|
||||||
|
if (minpos >= 0)
|
||||||
|
{
|
||||||
|
trim(minpos); // Adjust the trim point (size)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::bitSet& Foam::bitSet::xorEq(const bitSet& other, const bool strict)
|
||||||
|
{
|
||||||
|
if (&other == this)
|
||||||
|
{
|
||||||
|
// Self '^=' : results in clearing all bits
|
||||||
|
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform ^= on self: clears all bits" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
reset();
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (other.empty())
|
||||||
|
{
|
||||||
|
if ((debug & 2) && !empty())
|
||||||
|
{
|
||||||
|
// OK if both are empty
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform ^= using empty operand: ignore" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
// No (normal) overlap: no-op
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
else if (empty())
|
||||||
|
{
|
||||||
|
if (debug & 2)
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform ^= on empty bitSet" << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strict)
|
||||||
|
{
|
||||||
|
// No (normal) overlap: no-op
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((debug & 2) && (size() != other.size()))
|
||||||
|
{
|
||||||
|
InfoInFunction
|
||||||
|
<< "Perform ^= on dissimilar sized bitSets: "
|
||||||
|
<< size() << " vs. " << other.size() << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
label minpos = -1; // Min trim point
|
||||||
|
|
||||||
|
if ((size() < other.size()) && !strict)
|
||||||
|
{
|
||||||
|
minpos = size(); // This logic is explained in the orEq() method
|
||||||
|
resize(other.size()); // Blocks now overlap
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The operation (on overlapping blocks)
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(std::min(size(), other.size()));
|
||||||
|
const auto& rhs = other.blocks_;
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] ^= rhs[blocki];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Cleanup - minpos >= 0 means we need to check/adjust the trim point
|
||||||
|
if (minpos >= 0)
|
||||||
|
{
|
||||||
|
trim(minpos); // Adjust the trim point (size)
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::bitSet::bitSet(Istream& is)
|
||||||
|
:
|
||||||
|
PackedList<1>()
|
||||||
|
{
|
||||||
|
is >> *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::bitSet::assign(const UList<bool>& bools)
|
||||||
|
{
|
||||||
|
const label len = bools.size();
|
||||||
|
|
||||||
|
resize(len);
|
||||||
|
assign(false);
|
||||||
|
|
||||||
|
// Could also handle block-wise (in the future?)
|
||||||
|
|
||||||
|
// Set according to indices that are true.
|
||||||
|
for (label i = 0; i < len; ++i)
|
||||||
|
{
|
||||||
|
if (bools[i])
|
||||||
|
{
|
||||||
|
set(i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::bitSet::intersects(const bitSet& other) const
|
||||||
|
{
|
||||||
|
if (size() && other.size())
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(std::min(size(), other.size()));
|
||||||
|
const auto& rhs = other.blocks_;
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
if (bool(blocks_[blocki] & rhs[blocki]))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::bitSet::set(const labelRange& range)
|
||||||
|
{
|
||||||
|
labelRange slice(range);
|
||||||
|
slice.adjust(); // No negative start, size adjusted accordingly
|
||||||
|
|
||||||
|
// Range is invalid (zero-sized or entirely negative) - noop
|
||||||
|
if (slice.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Range finishes at or beyond the right side.
|
||||||
|
// - zero fill any gaps that we might create.
|
||||||
|
// - flood-fill the reset, which now correponds to the full range.
|
||||||
|
//
|
||||||
|
// NB: use labelRange after() for the exclusive end-value, which
|
||||||
|
// corresponds to our new set size.
|
||||||
|
if (slice.after() >= size())
|
||||||
|
{
|
||||||
|
resize(slice.start(), false);
|
||||||
|
resize(slice.after(), true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The more difficult case - everything in between.
|
||||||
|
// 1. sequence may begin/end in the same block
|
||||||
|
// 2. Cover more than one block
|
||||||
|
// a. with partial coverage in the first block
|
||||||
|
// b. with partial coverage in the end block
|
||||||
|
|
||||||
|
// The begin block/offset
|
||||||
|
unsigned int bblock = slice.first() / elem_per_block;
|
||||||
|
unsigned int bmask = slice.first() % elem_per_block;
|
||||||
|
|
||||||
|
// The end block/offset
|
||||||
|
unsigned int eblock = slice.after() / elem_per_block;
|
||||||
|
unsigned int emask = slice.after() % elem_per_block;
|
||||||
|
|
||||||
|
// Transform offsets to lower bit masks
|
||||||
|
if (bmask) bmask = mask_lower(bmask);
|
||||||
|
if (emask) emask = mask_lower(emask);
|
||||||
|
|
||||||
|
if (bblock == eblock)
|
||||||
|
{
|
||||||
|
// Same block - flll between the begin/end bits.
|
||||||
|
// Example:
|
||||||
|
// bmask = 0000000000001111 (lower bits)
|
||||||
|
// emask = 0000111111111111 (lower bits)
|
||||||
|
// -> set 0000111111110000 (xor)
|
||||||
|
|
||||||
|
blocks_[bblock] |= (emask^bmask);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bmask)
|
||||||
|
{
|
||||||
|
// The first (partial) block
|
||||||
|
// - set everything above the bmask.
|
||||||
|
blocks_[bblock] |= (~bmask);
|
||||||
|
++bblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fill these blocks
|
||||||
|
for (unsigned blocki = bblock; blocki < eblock; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = (~0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emask)
|
||||||
|
{
|
||||||
|
// The last (partial) block.
|
||||||
|
// - set everything below emask.
|
||||||
|
blocks_[eblock] |= (emask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::bitSet::unset(const labelRange& range)
|
||||||
|
{
|
||||||
|
// Require intersection with the current bitset
|
||||||
|
const labelRange slice = range.subset0(size());
|
||||||
|
|
||||||
|
// Range does not intersect (invalid, empty, bitset is empty)
|
||||||
|
if (slice.empty())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Range finishes at or beyond the right side.
|
||||||
|
//
|
||||||
|
// NB: use labelRange after() for the exclusive end-value, which
|
||||||
|
// corresponds to our new set size.
|
||||||
|
if (slice.after() >= size())
|
||||||
|
{
|
||||||
|
// The original size
|
||||||
|
const label orig = size();
|
||||||
|
|
||||||
|
resize(slice.start(), false);
|
||||||
|
resize(orig, false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// The more difficult case - everything in between.
|
||||||
|
// 1. sequence may begin/end in the same block
|
||||||
|
// 2. Cover more than one block
|
||||||
|
// a. with partial coverage in the first block
|
||||||
|
// b. with partial coverage in the end block
|
||||||
|
|
||||||
|
// The begin block/offset
|
||||||
|
unsigned int bblock = slice.first() / elem_per_block;
|
||||||
|
unsigned int bmask = slice.first() % elem_per_block;
|
||||||
|
|
||||||
|
// The end block/offset
|
||||||
|
unsigned int eblock = slice.after() / elem_per_block;
|
||||||
|
unsigned int emask = slice.after() % elem_per_block;
|
||||||
|
|
||||||
|
// Transform offsets to lower bit masks
|
||||||
|
if (bmask) bmask = mask_lower(bmask);
|
||||||
|
if (emask) emask = mask_lower(emask);
|
||||||
|
|
||||||
|
if (bblock == eblock)
|
||||||
|
{
|
||||||
|
// Same block - flll between the begin/end bits.
|
||||||
|
// Example:
|
||||||
|
// bmask = 0000000000001111 (lower bits)
|
||||||
|
// emask = 0000111111111111 (lower bits)
|
||||||
|
// -> set 0000111111110000 (xor)
|
||||||
|
// -> ~ 1111000000001111
|
||||||
|
|
||||||
|
blocks_[bblock] &= (~(emask^bmask));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (bmask)
|
||||||
|
{
|
||||||
|
// The first (partial) block
|
||||||
|
// - only retain things below bmask.
|
||||||
|
blocks_[bblock] &= (bmask);
|
||||||
|
++bblock;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Clear these blocks
|
||||||
|
for (unsigned blocki = bblock; blocki < eblock; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = (0u);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (emask)
|
||||||
|
{
|
||||||
|
// The last (partial) block.
|
||||||
|
// - only retain things above bmask.
|
||||||
|
blocks_[eblock] &= (~emask);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::labelList Foam::bitSet::toc() const
|
||||||
|
{
|
||||||
|
// Number of used (set) entries
|
||||||
|
const label total = any() ? count() : 0;
|
||||||
|
|
||||||
|
if (!total)
|
||||||
|
{
|
||||||
|
return labelList();
|
||||||
|
}
|
||||||
|
|
||||||
|
labelList output(total);
|
||||||
|
label nItem = 0;
|
||||||
|
|
||||||
|
// Process block-wise, detecting any '1' bits
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
|
||||||
|
if (blockval)
|
||||||
|
{
|
||||||
|
for (label pos = (blocki * elem_per_block); blockval; ++pos)
|
||||||
|
{
|
||||||
|
if (blockval & 1u)
|
||||||
|
{
|
||||||
|
output[nItem] = pos;
|
||||||
|
++nItem;
|
||||||
|
}
|
||||||
|
blockval >>= 1u;
|
||||||
|
}
|
||||||
|
if (nItem == total) break; // Terminate early
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::List<bool> Foam::bitSet::values() const
|
||||||
|
{
|
||||||
|
List<bool> output(size(), false);
|
||||||
|
|
||||||
|
// Process block-wise, detecting any '1' bits
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
label pos = (blocki * elem_per_block);
|
||||||
|
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
blockval;
|
||||||
|
blockval >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (blockval & 1u)
|
||||||
|
{
|
||||||
|
output[pos] = true;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
547
src/OpenFOAM/containers/Bits/bitSet/bitSet.H
Normal file
547
src/OpenFOAM/containers/Bits/bitSet/bitSet.H
Normal file
@ -0,0 +1,547 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::bitSet
|
||||||
|
|
||||||
|
Description
|
||||||
|
A bitSet stores bits (elements with only two states) in packed internal
|
||||||
|
format and supports a variety of bit-set operations.
|
||||||
|
Its behaviour is largely list-like, with some HashSet features.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
bitSetI.H
|
||||||
|
bitSet.C
|
||||||
|
bitSetIO.C
|
||||||
|
bitSetTemplates.C
|
||||||
|
|
||||||
|
See also
|
||||||
|
Foam::BitOps
|
||||||
|
Foam::PackedList
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef bitSet_H
|
||||||
|
#define bitSet_H
|
||||||
|
|
||||||
|
#include "className.H"
|
||||||
|
#include "PackedList.H"
|
||||||
|
#include "UIndirectList.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
|
class bitSet;
|
||||||
|
class labelRange;
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class bitSet Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
class bitSet
|
||||||
|
:
|
||||||
|
public PackedList<1>
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// Protected Member Functions
|
||||||
|
|
||||||
|
//- Write as a dictionary entry
|
||||||
|
void writeEntry(Ostream& os) const;
|
||||||
|
|
||||||
|
// Logic/Set Operations
|
||||||
|
|
||||||
|
//- The set difference
|
||||||
|
// \code
|
||||||
|
// A = (A - B)
|
||||||
|
// A = (A & !B)
|
||||||
|
// A = (A & ~B)
|
||||||
|
// \endcode
|
||||||
|
// A and B can have different sizes.
|
||||||
|
// Does not change the original set size.
|
||||||
|
bitSet& minusEq(const bitSet& other);
|
||||||
|
|
||||||
|
//- The set logical AND
|
||||||
|
// \code
|
||||||
|
// A = (A & B)
|
||||||
|
//
|
||||||
|
// \endcode
|
||||||
|
// A and B can have different sizes..
|
||||||
|
// Does not change the original set size.
|
||||||
|
bitSet& andEq(const bitSet& other);
|
||||||
|
|
||||||
|
//- The set logical OR
|
||||||
|
// \code
|
||||||
|
// A = (A | B)
|
||||||
|
// \endcode
|
||||||
|
// A and B can have different sizes
|
||||||
|
//
|
||||||
|
// \note
|
||||||
|
// The default (strict=true) ignores additional length from B,
|
||||||
|
// whereas (strict=false) permits the set to automatically grow
|
||||||
|
// to accommodate additional elements arising from B.
|
||||||
|
bitSet& orEq(const bitSet& other, const bool strict=true);
|
||||||
|
|
||||||
|
//- The set logical XOR
|
||||||
|
// \code
|
||||||
|
// A = (A ^ B)
|
||||||
|
// \endcode
|
||||||
|
// A and B can have different sizes. Sizing behaviour as per orEq.
|
||||||
|
bitSet& xorEq(const bitSet& other, const bool strict=true);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Forward declaration of access classes
|
||||||
|
|
||||||
|
class reference;
|
||||||
|
class const_iterator;
|
||||||
|
typedef unsigned int const_reference;
|
||||||
|
|
||||||
|
//- Define class name and debug
|
||||||
|
ClassName("bitSet");
|
||||||
|
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct an empty, zero-sized set
|
||||||
|
inline constexpr bitSet() noexcept;
|
||||||
|
|
||||||
|
//- Construct from Istream
|
||||||
|
explicit bitSet(Istream& is);
|
||||||
|
|
||||||
|
//- Construct with given size, with all bits set to 0
|
||||||
|
explicit inline bitSet(const label n);
|
||||||
|
|
||||||
|
//- Construct with given size and value for all elements
|
||||||
|
inline bitSet(const label n, const bool val);
|
||||||
|
|
||||||
|
//- Copy construct
|
||||||
|
inline bitSet(const bitSet& bitset);
|
||||||
|
|
||||||
|
//- Move construct
|
||||||
|
inline bitSet(bitSet&& bitset);
|
||||||
|
|
||||||
|
//- Construct from a list of bools
|
||||||
|
explicit inline bitSet(const UList<bool>& bools);
|
||||||
|
|
||||||
|
//- Construct with given size with all bits set to 0,
|
||||||
|
//- subsequently add specified locations as 1.
|
||||||
|
inline bitSet(const label n, const labelUList& locations);
|
||||||
|
|
||||||
|
//- Construct with given size with all bits set to 0,
|
||||||
|
//- subsequently add specified locations as 1.
|
||||||
|
inline bitSet(const label n, const labelUIndList& locations);
|
||||||
|
|
||||||
|
//- Construct with given size with all bits set to 0,
|
||||||
|
//- subsequently add specified locations as 1.
|
||||||
|
inline bitSet(const label n, std::initializer_list<label> locations);
|
||||||
|
|
||||||
|
//- Construct with automatic sizing (filled with 0),
|
||||||
|
//- and populate with specified locations as 1.
|
||||||
|
explicit inline bitSet(const labelUList& locations);
|
||||||
|
|
||||||
|
//- Construct with automatic sizing (filled with 0),
|
||||||
|
//- and populate with specified locations as 1.
|
||||||
|
explicit inline bitSet(const labelUIndList& locations);
|
||||||
|
|
||||||
|
//- Clone
|
||||||
|
inline autoPtr<bitSet> clone() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
// Query
|
||||||
|
|
||||||
|
//- True if all bits in this bitset are set or if the set is empty.
|
||||||
|
inline bool all() const;
|
||||||
|
|
||||||
|
//- True if any bits in this bitset are set.
|
||||||
|
inline bool any() const;
|
||||||
|
|
||||||
|
//- True if no bits in this bitset are set.
|
||||||
|
inline bool none() const;
|
||||||
|
|
||||||
|
//- True if there are two or more entries and all entries have
|
||||||
|
//- identical values.
|
||||||
|
inline bool uniform() const;
|
||||||
|
|
||||||
|
//- Count number of bits set.
|
||||||
|
inline unsigned int count() const;
|
||||||
|
|
||||||
|
//- True if any bits in the other bitset intersect (are the same).
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with boost::dynamic_bitset
|
||||||
|
bool intersects(const bitSet& other) const;
|
||||||
|
|
||||||
|
//- Test value at specified position, never auto-vivify entries.
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with std::bitset
|
||||||
|
inline bool test(const label pos) const;
|
||||||
|
|
||||||
|
//- Locate the first bit set.
|
||||||
|
// \return the location or -1 if there are no bits set.
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with boost::dynamic_bitset
|
||||||
|
inline label find_first() const;
|
||||||
|
|
||||||
|
//- Locate the last bit set.
|
||||||
|
// \return the location or -1 if there are no bits set.
|
||||||
|
//
|
||||||
|
// \note Provided for symmetry with find_first()
|
||||||
|
inline label find_last() const;
|
||||||
|
|
||||||
|
//- Locate the next bit set, starting one beyond the specified position
|
||||||
|
// \return the location or -1 if there are no further bits set.
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with boost::dynamic_bitset
|
||||||
|
inline label find_next(label pos) const;
|
||||||
|
|
||||||
|
//- The indices of the \a on bits as a sorted labelList.
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with HashSet
|
||||||
|
labelList toc() const;
|
||||||
|
|
||||||
|
//- The indices of the \a on bits as a sorted labelList.
|
||||||
|
// This is identical to toc(), which is always sorted.
|
||||||
|
//
|
||||||
|
// \note Method name compatibility with HashSet
|
||||||
|
inline labelList sortedToc() const;
|
||||||
|
|
||||||
|
//- Return the bitset values as a boolList.
|
||||||
|
List<bool> values() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Assignment
|
||||||
|
|
||||||
|
//- Assign all entries to the given value.
|
||||||
|
inline void assign(const bool val);
|
||||||
|
|
||||||
|
//- Copy assign all entries from a list of bools.
|
||||||
|
void assign(const UList<bool>& bools);
|
||||||
|
|
||||||
|
|
||||||
|
// Setting single or multiple values
|
||||||
|
|
||||||
|
//- Single index/value assign
|
||||||
|
using PackedList<1>::set;
|
||||||
|
|
||||||
|
//- Set specified bits from another bitset.
|
||||||
|
// The current set size may grow to accommodate any new bits
|
||||||
|
// (auto-vivifies).
|
||||||
|
inline void set(const bitSet& bitset);
|
||||||
|
|
||||||
|
//- Set the specified range of bits specified
|
||||||
|
// The current set size may grow to accommodate any new bits
|
||||||
|
// (auto-vivifies).
|
||||||
|
// \note this operation is generally more efficient than calling
|
||||||
|
// set(pos) on individual bits.
|
||||||
|
void set(const labelRange& range);
|
||||||
|
|
||||||
|
|
||||||
|
// Unsetting single or multiple values
|
||||||
|
|
||||||
|
//- Unset a single index
|
||||||
|
using PackedList<1>::unset;
|
||||||
|
|
||||||
|
//- Unset (subtract) the bits specified in the other bitset, which is
|
||||||
|
//- a set difference corresponds to the logical operation
|
||||||
|
// \code
|
||||||
|
// A = (A & !B)
|
||||||
|
// \endcode
|
||||||
|
// The result is comparable to 'operator-='
|
||||||
|
// \endcode
|
||||||
|
//
|
||||||
|
// A and B can have different sizes.
|
||||||
|
// Does not change the original set size.
|
||||||
|
inline bitSet& unset(const bitSet& other);
|
||||||
|
|
||||||
|
//- Unset the specified range of bits specified, never auto-vivifies.
|
||||||
|
// \note this operation can be more efficient than calling
|
||||||
|
// unset(pos) on individual bits.
|
||||||
|
void unset(const labelRange& range);
|
||||||
|
|
||||||
|
|
||||||
|
// Edit
|
||||||
|
|
||||||
|
//- Invert all bits in the addressable region
|
||||||
|
inline void flip();
|
||||||
|
|
||||||
|
//- Invert bits at the specified position.
|
||||||
|
// A no-op if the position is out-of-range
|
||||||
|
inline void flip(const label pos);
|
||||||
|
|
||||||
|
//- Swap contents
|
||||||
|
inline void swap(bitSet& bitset);
|
||||||
|
|
||||||
|
//- Transfer the contents of the argument list into this list
|
||||||
|
//- and annul the argument list.
|
||||||
|
inline void transfer(bitSet& bitset);
|
||||||
|
|
||||||
|
|
||||||
|
// Convenience methods
|
||||||
|
|
||||||
|
//- Ensure the addressable range does not exceed maxSize.
|
||||||
|
// Either decreases the size of the bitSet or is a no-op.
|
||||||
|
//
|
||||||
|
// \code
|
||||||
|
// pointField& pts = mesh.points();
|
||||||
|
// bitset.bound(pts.size());
|
||||||
|
//
|
||||||
|
// for (const label pointi : bitset)
|
||||||
|
// {
|
||||||
|
// pts[pointi] ...
|
||||||
|
// }
|
||||||
|
// \endcode
|
||||||
|
inline bitSet& bound(const label maxSize);
|
||||||
|
|
||||||
|
//- Ensure the addressable range does not exceed that of other.
|
||||||
|
// Either decreases the size of the bitSet or is a no-op.
|
||||||
|
inline bitSet& bound(const bitSet& other);
|
||||||
|
|
||||||
|
//- Ensure that minSize is covered by the bitSet.
|
||||||
|
// Either increases the size of the bitSet or is a no-op.
|
||||||
|
inline bitSet& extend(const label minSize);
|
||||||
|
|
||||||
|
//- Ensure the bitset is addressable throughout the range of other.
|
||||||
|
// Either increases the size of the bitSet or is a no-op.
|
||||||
|
inline bitSet& extend(const bitSet& other);
|
||||||
|
|
||||||
|
//- Set the listed locations to true.
|
||||||
|
// Does auto-vivify for non-existent entries.
|
||||||
|
inline void setMany(const labelUList& locations);
|
||||||
|
|
||||||
|
//- Set the listed locations to true.
|
||||||
|
// Does auto-vivify for non-existent entries.
|
||||||
|
inline void setMany(const labelUIndList& locations);
|
||||||
|
|
||||||
|
//- Set the locations listed by the iterator range,
|
||||||
|
// auto-vivify entries if needed.
|
||||||
|
template<class InputIter>
|
||||||
|
void setMany(InputIter first, InputIter last);
|
||||||
|
|
||||||
|
//- Unset the listed locations, never auto-vivifies.
|
||||||
|
inline void unsetMany(const labelUList& locations);
|
||||||
|
|
||||||
|
//- Unset the listed locations, never auto-vivifies.
|
||||||
|
inline void unsetMany(const labelUIndList& locations);
|
||||||
|
|
||||||
|
//- Unset the locations listed by the iterator range,
|
||||||
|
//- never auto-vivify entries.
|
||||||
|
template<class InputIter>
|
||||||
|
void unsetMany(InputIter first, InputIter last);
|
||||||
|
|
||||||
|
|
||||||
|
// Access helpers
|
||||||
|
|
||||||
|
//- A reference supporting read/write access to an entry
|
||||||
|
class reference
|
||||||
|
:
|
||||||
|
public PackedList<1>::reference
|
||||||
|
{
|
||||||
|
protected:
|
||||||
|
friend class bitSet; // Access for parent
|
||||||
|
void operator&() = delete; // Refuse to provide its address
|
||||||
|
|
||||||
|
//- Construct by taking reference of block from within
|
||||||
|
//- the list and the specified index.
|
||||||
|
inline reference(bitSet* parent, const label index);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Flip the bit at the position, no range-checking
|
||||||
|
inline void flip();
|
||||||
|
|
||||||
|
//- Value assignment
|
||||||
|
inline void operator=(const reference& other);
|
||||||
|
|
||||||
|
//- Value assignment
|
||||||
|
inline void operator=(const unsigned int val);
|
||||||
|
|
||||||
|
//- Conversion operator
|
||||||
|
inline operator unsigned int () const;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Iteration
|
||||||
|
|
||||||
|
//- A const_iterator for iterating across \a on values
|
||||||
|
class const_iterator
|
||||||
|
{
|
||||||
|
friend class bitSet;
|
||||||
|
|
||||||
|
//- The parent being iterated
|
||||||
|
const bitSet* set_;
|
||||||
|
|
||||||
|
//- Global position of the current \a on bit
|
||||||
|
label pos_;
|
||||||
|
|
||||||
|
//- Construct null - an end iterator
|
||||||
|
inline const_iterator() noexcept;
|
||||||
|
|
||||||
|
//- Construct begin iterator
|
||||||
|
inline const_iterator(const bitSet* bitset);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
//- Return the current \a on position
|
||||||
|
inline label operator*() const noexcept;
|
||||||
|
|
||||||
|
//- Move to the next \a on position
|
||||||
|
inline const_iterator& operator++();
|
||||||
|
|
||||||
|
inline bool operator==(const const_iterator& iter) const noexcept;
|
||||||
|
inline bool operator!=(const const_iterator& iter) const noexcept;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//- Iterator set to the position of the first \a on bit
|
||||||
|
inline const_iterator begin() const;
|
||||||
|
|
||||||
|
//- Iterator set to the position of the first \a on bit
|
||||||
|
inline const_iterator cbegin() const;
|
||||||
|
|
||||||
|
//- Iterator beyond the end of the bitSet
|
||||||
|
inline const_iterator end() const noexcept;
|
||||||
|
|
||||||
|
//- Iterator beyond the end of the bitSet
|
||||||
|
inline const_iterator cend() const noexcept;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
//- Identical to get() - get value at index.
|
||||||
|
// Never auto-vivify entries.
|
||||||
|
inline unsigned int operator[](const label i) const;
|
||||||
|
|
||||||
|
//- Non-const access to value at index.
|
||||||
|
// Fatal for out-of-range indices
|
||||||
|
inline reference operator[](const label i);
|
||||||
|
|
||||||
|
//- Assignment of all entries to the given value.
|
||||||
|
inline bitSet& operator=(const bool val);
|
||||||
|
|
||||||
|
//- Copy assignment
|
||||||
|
inline bitSet& operator=(const bitSet& bitset);
|
||||||
|
|
||||||
|
//- Move assignment
|
||||||
|
inline bitSet& operator=(bitSet&& bitset);
|
||||||
|
|
||||||
|
//- Complement operator.
|
||||||
|
// Return a copy of the existing set with all its bits flipped.
|
||||||
|
inline bitSet operator~() const;
|
||||||
|
|
||||||
|
//- Bitwise-AND all the bits in other with the bits in this bitset.
|
||||||
|
// The operands may have dissimilar sizes without affecting the size
|
||||||
|
// of the set.
|
||||||
|
inline bitSet& operator&=(const bitSet& other);
|
||||||
|
|
||||||
|
//- Bitwise-OR operator - similar to the set() method.
|
||||||
|
// The operands may have dissimilar sizes without affecting the size
|
||||||
|
// of the set.
|
||||||
|
inline bitSet& operator|=(const bitSet& other);
|
||||||
|
|
||||||
|
//- Bitwise-XOR operator - retains unique entries.
|
||||||
|
// The operands may have dissimilar sizes without affecting the size
|
||||||
|
// of the set.
|
||||||
|
inline bitSet& operator^=(const bitSet& other);
|
||||||
|
|
||||||
|
//- Remove entries from this list - identical to the unset() method.
|
||||||
|
// The operands may have dissimilar sizes without affecting the size
|
||||||
|
// of the set.
|
||||||
|
inline bitSet& operator-=(const bitSet& other);
|
||||||
|
|
||||||
|
|
||||||
|
// IO
|
||||||
|
|
||||||
|
//- Write the bitSet, with line-breaks in ASCII if the size
|
||||||
|
//- exceeds shortListLen.
|
||||||
|
// Using '0' suppresses line-breaks entirely.
|
||||||
|
Ostream& writeList(Ostream& os, const label shortListLen=0) const;
|
||||||
|
|
||||||
|
//- Write as a dictionary entry with keyword
|
||||||
|
void writeEntry(const word& keyword, Ostream& os) const;
|
||||||
|
|
||||||
|
|
||||||
|
// IOstream Operators
|
||||||
|
|
||||||
|
//- Return info proxy
|
||||||
|
InfoProxy<bitSet> info() const
|
||||||
|
{
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
friend Ostream& operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const InfoProxy<bitSet>& info
|
||||||
|
);
|
||||||
|
|
||||||
|
friend Ostream& operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const bitSet& bitset
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Global Operators
|
||||||
|
|
||||||
|
//- Bitwise-AND of two bitsets.
|
||||||
|
// See bitSet::operator&= for more details.
|
||||||
|
inline bitSet operator&(const bitSet& a, const bitSet& b);
|
||||||
|
|
||||||
|
//- Bitwise-OR of two bitsets
|
||||||
|
// See bitSet::operator|= for more details.
|
||||||
|
inline bitSet operator|(const bitSet& a, const bitSet& b);
|
||||||
|
|
||||||
|
//- Bitwise-XOR of two bitsets to form a unique bit-set
|
||||||
|
// See bitSet::operator^= for more details.
|
||||||
|
inline bitSet operator^(const bitSet& a, const bitSet& b);
|
||||||
|
|
||||||
|
//- Bitwise difference (subset) of two bitsets to form a unique bit-set
|
||||||
|
// See bitSet::operator-= for more details.
|
||||||
|
inline bitSet operator-(const bitSet& a, const bitSet& b);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "bitSetI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#ifdef NoRepository
|
||||||
|
#include "bitSetTemplates.C"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
672
src/OpenFOAM/containers/Bits/bitSet/bitSetI.H
Normal file
672
src/OpenFOAM/containers/Bits/bitSet/bitSetI.H
Normal file
@ -0,0 +1,672 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline constexpr Foam::bitSet::bitSet() noexcept
|
||||||
|
:
|
||||||
|
PackedList<1>()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const label n)
|
||||||
|
:
|
||||||
|
PackedList<1>(n)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const label n, const bool val)
|
||||||
|
:
|
||||||
|
bitSet(n)
|
||||||
|
{
|
||||||
|
if (val) assign(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const bitSet& bitset)
|
||||||
|
:
|
||||||
|
PackedList<1>(bitset)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(bitSet&& bitset)
|
||||||
|
:
|
||||||
|
PackedList<1>(std::move(bitset))
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const UList<bool>& bools)
|
||||||
|
:
|
||||||
|
bitSet()
|
||||||
|
{
|
||||||
|
assign(bools);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const label n, const labelUList& locations)
|
||||||
|
:
|
||||||
|
bitSet(n)
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const label n, const labelUIndList& locations)
|
||||||
|
:
|
||||||
|
bitSet(n)
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet
|
||||||
|
(
|
||||||
|
const label n,
|
||||||
|
std::initializer_list<label> locations
|
||||||
|
)
|
||||||
|
:
|
||||||
|
bitSet(n)
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const labelUList& locations)
|
||||||
|
:
|
||||||
|
bitSet()
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::bitSet(const labelUIndList& locations)
|
||||||
|
:
|
||||||
|
bitSet()
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::autoPtr<Foam::bitSet> Foam::bitSet::clone() const
|
||||||
|
{
|
||||||
|
return autoPtr<bitSet>::New(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * References * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::bitSet::reference::reference
|
||||||
|
(
|
||||||
|
bitSet* parent,
|
||||||
|
const label index
|
||||||
|
)
|
||||||
|
:
|
||||||
|
PackedList<1>::reference(parent, index)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::reference::flip()
|
||||||
|
{
|
||||||
|
const unsigned int mask = (max_value << shift_);
|
||||||
|
ref_ ^= mask;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::reference::operator=
|
||||||
|
(
|
||||||
|
const reference& other
|
||||||
|
)
|
||||||
|
{
|
||||||
|
set(other.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::reference::operator=
|
||||||
|
(
|
||||||
|
const unsigned int val
|
||||||
|
)
|
||||||
|
{
|
||||||
|
set(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::reference::operator unsigned int () const
|
||||||
|
{
|
||||||
|
return get();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Iterators * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator::const_iterator() noexcept
|
||||||
|
:
|
||||||
|
set_(nullptr),
|
||||||
|
pos_(-1)
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator::const_iterator(const bitSet* parent)
|
||||||
|
:
|
||||||
|
set_(parent),
|
||||||
|
pos_(set_->find_first())
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::bitSet::const_iterator::operator*() const noexcept
|
||||||
|
{
|
||||||
|
return pos_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator& Foam::bitSet::const_iterator::operator++()
|
||||||
|
{
|
||||||
|
pos_ = set_->find_next(pos_);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::const_iterator::operator==
|
||||||
|
(
|
||||||
|
const const_iterator& iter
|
||||||
|
) const noexcept
|
||||||
|
{
|
||||||
|
return (iter.pos_ == pos_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::const_iterator::operator!=
|
||||||
|
(
|
||||||
|
const const_iterator& iter
|
||||||
|
) const noexcept
|
||||||
|
{
|
||||||
|
return (iter.pos_ != pos_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator Foam::bitSet::begin() const
|
||||||
|
{
|
||||||
|
return const_iterator(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator Foam::bitSet::cbegin() const
|
||||||
|
{
|
||||||
|
return const_iterator(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator Foam::bitSet::end() const noexcept
|
||||||
|
{
|
||||||
|
return const_iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::const_iterator Foam::bitSet::cend() const noexcept
|
||||||
|
{
|
||||||
|
return const_iterator();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::bitSet::find_first() const
|
||||||
|
{
|
||||||
|
// Process block-wise, detecting any '1' bits
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
label pos = (blocki * elem_per_block);
|
||||||
|
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
blockval;
|
||||||
|
blockval >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (blockval & 1u)
|
||||||
|
{
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::bitSet::find_last() const
|
||||||
|
{
|
||||||
|
// Process block-wise, detecting any '1' bits
|
||||||
|
|
||||||
|
for (label blocki = num_blocks(size())-1; blocki >= 0; --blocki)
|
||||||
|
{
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
|
||||||
|
if (blockval)
|
||||||
|
{
|
||||||
|
label pos = (blocki * elem_per_block) - 1;
|
||||||
|
|
||||||
|
while (blockval)
|
||||||
|
{
|
||||||
|
blockval >>= 1u;
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::label Foam::bitSet::find_next(label pos) const
|
||||||
|
{
|
||||||
|
++pos;
|
||||||
|
if (pos < 0 || pos >= size())
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The corresponding block/offset
|
||||||
|
label blocki = pos / elem_per_block;
|
||||||
|
unsigned int off = pos % elem_per_block;
|
||||||
|
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned int blockval = (blocks_[blocki] >> off);
|
||||||
|
blockval;
|
||||||
|
blockval >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (blockval & 1u)
|
||||||
|
{
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Normal block-wise search. Starting at the next block
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
for (++blocki; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
label pos = (blocki * elem_per_block);
|
||||||
|
|
||||||
|
for
|
||||||
|
(
|
||||||
|
unsigned int blockval = blocks_[blocki];
|
||||||
|
blockval;
|
||||||
|
blockval >>= 1u
|
||||||
|
)
|
||||||
|
{
|
||||||
|
if (blockval & 1u)
|
||||||
|
{
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
++pos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::all() const
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Use complement to change 0 <-> 1 and check if any 1's now appear
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
// Extra bits in the final block?
|
||||||
|
const unsigned int off = size() % elem_per_block;
|
||||||
|
|
||||||
|
if (!off)
|
||||||
|
{
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
if (~(blocks_[blocki]))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (label blocki=0; blocki < nblocks-1; ++blocki)
|
||||||
|
{
|
||||||
|
if (~(blocks_[blocki]))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify the final block, with masking
|
||||||
|
|
||||||
|
return (!(~blocks_[nblocks-1] & mask_lower(off)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::any() const
|
||||||
|
{
|
||||||
|
if (size())
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
if (blocks_[blocki]) return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::none() const
|
||||||
|
{
|
||||||
|
return !any();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::uniform() const
|
||||||
|
{
|
||||||
|
return (size() > 1 && (test(0) ? all() : none()));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline unsigned int Foam::bitSet::count() const
|
||||||
|
{
|
||||||
|
unsigned int total = 0;
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
for (label blocki = 0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
total += BitOps::bit_count(blocks_[blocki]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline bool Foam::bitSet::test(const label pos) const
|
||||||
|
{
|
||||||
|
return get(pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::labelList Foam::bitSet::sortedToc() const
|
||||||
|
{
|
||||||
|
return toc();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::swap(bitSet& bitset)
|
||||||
|
{
|
||||||
|
PackedList<1>::swap(bitset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::transfer(bitSet& bitset)
|
||||||
|
{
|
||||||
|
PackedList<1>::transfer(bitset);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::assign(const bool val)
|
||||||
|
{
|
||||||
|
if (empty())
|
||||||
|
{
|
||||||
|
return; // Trivial case
|
||||||
|
}
|
||||||
|
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
if (val)
|
||||||
|
{
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = (~0u);
|
||||||
|
}
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = (0u);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::set(const bitSet& bitset)
|
||||||
|
{
|
||||||
|
orEq(bitset, false); // Non-strict: Lets the set size grow.
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::setMany(const labelUList& locations)
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::setMany(const labelUIndList& locations)
|
||||||
|
{
|
||||||
|
setMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::unsetMany(const labelUList& locations)
|
||||||
|
{
|
||||||
|
unsetMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::unsetMany(const labelUIndList& locations)
|
||||||
|
{
|
||||||
|
unsetMany(locations.begin(), locations.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::unset(const bitSet& other)
|
||||||
|
{
|
||||||
|
return minusEq(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::flip()
|
||||||
|
{
|
||||||
|
if (size())
|
||||||
|
{
|
||||||
|
const label nblocks = num_blocks(size());
|
||||||
|
|
||||||
|
for (label blocki=0; blocki < nblocks; ++blocki)
|
||||||
|
{
|
||||||
|
blocks_[blocki] = ~(blocks_[blocki]);
|
||||||
|
}
|
||||||
|
clear_trailing_bits();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline void Foam::bitSet::flip(const label i)
|
||||||
|
{
|
||||||
|
if (i >= 0 && i < size())
|
||||||
|
{
|
||||||
|
reference(this, i).flip();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::bound(const label maxSize)
|
||||||
|
{
|
||||||
|
if (maxSize < size())
|
||||||
|
{
|
||||||
|
resize(maxSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::bound(const bitSet& other)
|
||||||
|
{
|
||||||
|
return bound(other.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::extend(const label minSize)
|
||||||
|
{
|
||||||
|
if (size() < minSize)
|
||||||
|
{
|
||||||
|
resize(minSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::extend(const bitSet& other)
|
||||||
|
{
|
||||||
|
return extend(other.size());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline unsigned int Foam::bitSet::operator[](const label i) const
|
||||||
|
{
|
||||||
|
return get(i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet::reference Foam::bitSet::operator[](const label i)
|
||||||
|
{
|
||||||
|
// Leave enabled during testing period (MAR-2018) ... and perhaps later too
|
||||||
|
// #ifdef FULLDEBUG
|
||||||
|
checkIndex(i);
|
||||||
|
// #endif
|
||||||
|
return reference(this, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator=(const bool val)
|
||||||
|
{
|
||||||
|
PackedList<1>::operator=(val);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator=(const bitSet& bitset)
|
||||||
|
{
|
||||||
|
PackedList<1>::operator=(bitset);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator=(bitSet&& bitset)
|
||||||
|
{
|
||||||
|
transfer(bitset);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet Foam::bitSet::operator~() const
|
||||||
|
{
|
||||||
|
bitSet result(*this);
|
||||||
|
result.flip();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator&=(const bitSet& other)
|
||||||
|
{
|
||||||
|
return andEq(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator|=(const bitSet& other)
|
||||||
|
{
|
||||||
|
return orEq(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator^=(const bitSet& other)
|
||||||
|
{
|
||||||
|
return xorEq(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet& Foam::bitSet::operator-=(const bitSet& other)
|
||||||
|
{
|
||||||
|
return minusEq(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Global Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
inline Foam::bitSet Foam::operator&(const bitSet& a, const bitSet& b)
|
||||||
|
{
|
||||||
|
bitSet result(a);
|
||||||
|
return (result &= b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet Foam::operator|(const bitSet& a, const bitSet& b)
|
||||||
|
{
|
||||||
|
bitSet result(a);
|
||||||
|
return (result |= b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet Foam::operator^(const bitSet& a, const bitSet& b)
|
||||||
|
{
|
||||||
|
bitSet result(a);
|
||||||
|
return (result ^= b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Foam::bitSet Foam::operator-(const bitSet& a, const bitSet& b)
|
||||||
|
{
|
||||||
|
bitSet result(a);
|
||||||
|
return (result -= b);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
135
src/OpenFOAM/containers/Bits/bitSet/bitSetIO.C
Normal file
135
src/OpenFOAM/containers/Bits/bitSet/bitSetIO.C
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "bitSet.H"
|
||||||
|
#include "IOstreams.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::bitSet::writeEntry(Ostream& os) const
|
||||||
|
{
|
||||||
|
os << *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::bitSet::writeList
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const label shortListLen
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
const bitSet& list = *this;
|
||||||
|
const label len = list.size();
|
||||||
|
|
||||||
|
// Write list contents depending on data format
|
||||||
|
if (os.format() == IOstream::ASCII)
|
||||||
|
{
|
||||||
|
if (list.uniform())
|
||||||
|
{
|
||||||
|
// Two or more entries, and all entries have identical values.
|
||||||
|
os << len << token::BEGIN_BLOCK << list[0] << token::END_BLOCK;
|
||||||
|
}
|
||||||
|
else if (!shortListLen || len <= shortListLen)
|
||||||
|
{
|
||||||
|
// Shorter list, or line-breaks suppressed
|
||||||
|
os << len << token::BEGIN_LIST;
|
||||||
|
for (label i=0; i < len; ++i)
|
||||||
|
{
|
||||||
|
if (i) os << token::SPACE;
|
||||||
|
os << list[i];
|
||||||
|
}
|
||||||
|
os << token::END_LIST;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Longer list
|
||||||
|
os << nl << len << nl << token::BEGIN_LIST << nl;
|
||||||
|
for (label i=0; i < len; ++i)
|
||||||
|
{
|
||||||
|
os << list[i] << nl;
|
||||||
|
}
|
||||||
|
os << token::END_LIST << nl;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Contents are binary and contiguous
|
||||||
|
os << nl << len << nl;
|
||||||
|
|
||||||
|
if (len)
|
||||||
|
{
|
||||||
|
// write(...) includes surrounding start/end delimiters
|
||||||
|
os.write
|
||||||
|
(
|
||||||
|
reinterpret_cast<const char*>(list.storage().cdata()),
|
||||||
|
list.byteSize()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::bitSet::writeEntry
|
||||||
|
(
|
||||||
|
const word& keyword,
|
||||||
|
Ostream& os
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
os.writeKeyword(keyword);
|
||||||
|
writeEntry(os);
|
||||||
|
os << token::END_STATEMENT << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const bitSet& bitset)
|
||||||
|
{
|
||||||
|
return bitset.writeList(os, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Foam::Ostream& Foam::operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const InfoProxy<bitSet>& iproxy
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const bitSet& bitset = iproxy.t_;
|
||||||
|
|
||||||
|
os << "bitSet<" << bitSet::elem_per_block
|
||||||
|
<< "> size=" << bitset.size() << "/" << bitset.capacity()
|
||||||
|
<< " count=" << bitset.count()
|
||||||
|
<< nl;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
59
src/OpenFOAM/containers/Bits/bitSet/bitSetTemplates.C
Normal file
59
src/OpenFOAM/containers/Bits/bitSet/bitSetTemplates.C
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 2018 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class InputIter>
|
||||||
|
void Foam::bitSet::setMany(InputIter first, InputIter last)
|
||||||
|
{
|
||||||
|
// Check the max expected value first
|
||||||
|
const auto max = std::max_element(first, last);
|
||||||
|
const label len = (max != last ? (1 + *max) : 0);
|
||||||
|
|
||||||
|
if (len > 0)
|
||||||
|
{
|
||||||
|
reserve(len);
|
||||||
|
|
||||||
|
for (; first != last; ++first)
|
||||||
|
{
|
||||||
|
set(*first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class InputIter>
|
||||||
|
void Foam::bitSet::unsetMany(InputIter first, InputIter last)
|
||||||
|
{
|
||||||
|
for (; first != last; ++first)
|
||||||
|
{
|
||||||
|
unset(*first);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
@ -24,26 +24,23 @@ License
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "HashOps.H"
|
#include "HashOps.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::labelHashSet Foam::HashSetOps::used(const PackedBoolList& select)
|
Foam::labelHashSet Foam::HashSetOps::used(const bitSet& select)
|
||||||
{
|
{
|
||||||
const label count = select.count();
|
labelHashSet output(0);
|
||||||
const label len = select.size();
|
|
||||||
|
|
||||||
labelHashSet output(2*count);
|
if (select.any())
|
||||||
|
|
||||||
label used = 0;
|
|
||||||
for (label i = 0; i < len && used < count; ++i)
|
|
||||||
{
|
{
|
||||||
if (select[i])
|
output.resize(2*select.count());
|
||||||
|
|
||||||
|
for (label i = select.find_first(); i >= 0; i = select.find_next(i))
|
||||||
{
|
{
|
||||||
output.insert(i);
|
output.insert(i);
|
||||||
++used;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,11 +50,10 @@ Foam::labelHashSet Foam::HashSetOps::used(const PackedBoolList& select)
|
|||||||
|
|
||||||
Foam::labelHashSet Foam::HashSetOps::used(const UList<bool>& select)
|
Foam::labelHashSet Foam::HashSetOps::used(const UList<bool>& select)
|
||||||
{
|
{
|
||||||
// We have no estimate of the size/sparsity, just assume 1/10
|
|
||||||
|
|
||||||
const label len = select.size();
|
const label len = select.size();
|
||||||
|
|
||||||
labelHashSet output(len/10);
|
// No idea of the sparseness, just assume 1/8
|
||||||
|
labelHashSet output(len/4);
|
||||||
|
|
||||||
for (label i = 0; i < len; ++i)
|
for (label i = 0; i < len; ++i)
|
||||||
{
|
{
|
||||||
@ -71,34 +67,19 @@ Foam::labelHashSet Foam::HashSetOps::used(const UList<bool>& select)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::HashSetOps::bitset(const labelHashSet& labels)
|
Foam::bitSet Foam::HashSetOps::bitset(const labelHashSet& locations)
|
||||||
{
|
{
|
||||||
auto const max = std::max_element(labels.cbegin(), labels.cend());
|
bitSet output;
|
||||||
const label len = (max.found() ? (1 + *max) : 0);
|
output.setMany(locations.begin(), locations.end());
|
||||||
|
|
||||||
if (len <= 0)
|
|
||||||
{
|
|
||||||
return PackedBoolList();
|
|
||||||
}
|
|
||||||
|
|
||||||
PackedBoolList output(len);
|
|
||||||
|
|
||||||
for (const label i : labels)
|
|
||||||
{
|
|
||||||
if (i >= 0)
|
|
||||||
{
|
|
||||||
output.set(i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::List<bool> Foam::HashSetOps::bools(const labelHashSet& labels)
|
Foam::List<bool> Foam::HashSetOps::bools(const labelHashSet& locations)
|
||||||
{
|
{
|
||||||
auto const max = std::max_element(labels.cbegin(), labels.cend());
|
auto const max = std::max_element(locations.begin(), locations.end());
|
||||||
const label len = (max.found() ? (1 + *max) : 0);
|
const label len = (max != locations.end() ? (1 + *max) : 0);
|
||||||
|
|
||||||
if (len <= 0)
|
if (len <= 0)
|
||||||
{
|
{
|
||||||
@ -107,7 +88,7 @@ Foam::List<bool> Foam::HashSetOps::bools(const labelHashSet& labels)
|
|||||||
|
|
||||||
List<bool> output(len, false);
|
List<bool> output(len, false);
|
||||||
|
|
||||||
for (const label i : labels)
|
for (const label i : locations)
|
||||||
{
|
{
|
||||||
if (i >= 0)
|
if (i >= 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -49,7 +49,7 @@ namespace Foam
|
|||||||
|
|
||||||
// Forward declarations
|
// Forward declarations
|
||||||
|
|
||||||
class PackedBoolList;
|
class bitSet;
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -60,7 +60,7 @@ class PackedBoolList;
|
|||||||
namespace HashSetOps
|
namespace HashSetOps
|
||||||
{
|
{
|
||||||
|
|
||||||
//- Combine HashSet operation. Equivalent to 'a += b'
|
//- Combine HashSet operation. Equivalent to 'a |= b'
|
||||||
template<class Key=word, class Hash=string::hash>
|
template<class Key=word, class Hash=string::hash>
|
||||||
struct plusEqOp
|
struct plusEqOp
|
||||||
{
|
{
|
||||||
@ -68,52 +68,56 @@ struct plusEqOp
|
|||||||
|
|
||||||
void operator()(value_type& a, const value_type& b) const
|
void operator()(value_type& a, const value_type& b) const
|
||||||
{
|
{
|
||||||
a += b;
|
a |= b;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
//- Convert a packed list of bits to a labelHashSet of the indices used.
|
//- Convert a bitset to a labelHashSet of the indices used.
|
||||||
//
|
//
|
||||||
// \param selection the list for which a 'true' entry corresponds
|
// \param select the bitset for which an \a on entry corresponds
|
||||||
// to an index for be added to the labelHashSet
|
// to an index in the output labelHashSet
|
||||||
//
|
//
|
||||||
// \return a labelHashSet of the selected indices
|
// \return a labelHashSet of the selected indices
|
||||||
labelHashSet used(const PackedBoolList& select);
|
//
|
||||||
|
// This is equivalent of the following code, but more efficiently implemented.
|
||||||
|
// \code
|
||||||
|
// bitSet select = ...;
|
||||||
|
// return labelHashSet(select.toc());
|
||||||
|
// \endcode
|
||||||
|
labelHashSet used(const bitSet& select);
|
||||||
|
|
||||||
|
|
||||||
//- Convert a list of bools to a labelHashSet of the indices used.
|
//- Convert a list of bools to a labelHashSet of the indices used.
|
||||||
//
|
//
|
||||||
// \param selection the list for which a 'true' entry corresponds
|
// \param select the boolList for which a \a true entry corresponds
|
||||||
// to an index for be added to the labelHashSet
|
// to an index in the output labelHashSet
|
||||||
//
|
//
|
||||||
// \return a labelHashSet of the selected indices
|
// \return a labelHashSet of the selected indices
|
||||||
labelHashSet used(const UList<bool>& select);
|
labelHashSet used(const UList<bool>& select);
|
||||||
|
|
||||||
|
|
||||||
//- Convert labels to a packed list of bits, with '1' for each
|
//- Transform the \a on locations to a bitSet.
|
||||||
//- non-negative value and '0' for all others.
|
|
||||||
//
|
//
|
||||||
// \param labels the list of indices.
|
// \param locations the list of positions corresponding to an \a on bit.
|
||||||
//
|
//
|
||||||
// \return a packed bit list of the selected indices
|
// \return a bitset
|
||||||
//
|
//
|
||||||
// \note The operation discards any negative values since these are
|
// \note The operation necessarily discards any negative values since these
|
||||||
// invalid positions in the output list.
|
// are invalid positions in a bitset.
|
||||||
PackedBoolList bitset(const labelHashSet& labels);
|
bitSet bitset(const labelHashSet& locations);
|
||||||
|
|
||||||
|
|
||||||
//- Convert labels to a list of bools, with 'true' for each
|
//- Transform the \a on locations to a boolList, with \a true for each
|
||||||
//- non-negative value and 'false' for all others.
|
//- non-negative location and \a false for all others.
|
||||||
//
|
//
|
||||||
// \param labels the list of indices.
|
// \param locations the list of positions corresponding to an \a on bit.
|
||||||
//
|
//
|
||||||
// \return a bool List of the selected indices
|
// \return a boolList
|
||||||
//
|
//
|
||||||
// \note The operation discards any negative values since these are
|
// \note The operation necessarily discards any negative values since these
|
||||||
// invalid positions in the output list.
|
// are invalid positions in a boolList.
|
||||||
List<bool> bools(const labelHashSet& labels);
|
List<bool> bools(const labelHashSet& locations);
|
||||||
|
|
||||||
|
|
||||||
} // End namespace HashSetOps
|
} // End namespace HashSetOps
|
||||||
|
|
||||||
|
|||||||
@ -115,16 +115,16 @@ Foam::labelList Foam::identity(const label len, const label start)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::reorder
|
Foam::bitSet Foam::reorder
|
||||||
(
|
(
|
||||||
const labelUList& oldToNew,
|
const labelUList& oldToNew,
|
||||||
const PackedBoolList& input,
|
const bitSet& input,
|
||||||
const bool prune
|
const bool prune
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
const label len = input.size();
|
const label len = input.size();
|
||||||
|
|
||||||
PackedBoolList output(len);
|
bitSet output;
|
||||||
output.reserve(len);
|
output.reserve(len);
|
||||||
|
|
||||||
for (label i=0; i < len; ++i)
|
for (label i=0; i < len; ++i)
|
||||||
@ -149,10 +149,6 @@ Foam::PackedBoolList Foam::reorder
|
|||||||
output.trim();
|
output.trim();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify addresses (for movable refs)
|
|
||||||
// Info<< "reordered in " << long(input.storage().cdata()) << nl
|
|
||||||
// << "reordered out " << long(output.storage().cdata()) << nl;
|
|
||||||
|
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -160,14 +156,11 @@ Foam::PackedBoolList Foam::reorder
|
|||||||
void Foam::inplaceReorder
|
void Foam::inplaceReorder
|
||||||
(
|
(
|
||||||
const labelUList& oldToNew,
|
const labelUList& oldToNew,
|
||||||
PackedBoolList& input,
|
bitSet& input,
|
||||||
const bool prune
|
const bool prune
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
input = reorder(oldToNew, input, prune);
|
input = reorder(oldToNew, input, prune);
|
||||||
|
|
||||||
// Verify address (for movable refs)
|
|
||||||
// Info<< "now have " << long(input.storage().cdata()) << nl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -45,7 +45,7 @@ SourceFiles
|
|||||||
#include "FlatOutput.H"
|
#include "FlatOutput.H"
|
||||||
#include "labelList.H"
|
#include "labelList.H"
|
||||||
#include "HashSet.H"
|
#include "HashSet.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "ops.H"
|
#include "ops.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -126,22 +126,20 @@ void inplaceReorder
|
|||||||
|
|
||||||
|
|
||||||
//- Reorder the elements of a list.
|
//- Reorder the elements of a list.
|
||||||
// Similar to the general templated form, but with auto-vivify
|
// Similar to the general templated form, but with auto-vivify for Bitset.
|
||||||
// for PackedBoolList.
|
bitSet reorder
|
||||||
PackedBoolList reorder
|
|
||||||
(
|
(
|
||||||
const labelUList& oldToNew,
|
const labelUList& oldToNew,
|
||||||
const PackedBoolList& input,
|
const bitSet& input,
|
||||||
const bool prune = false
|
const bool prune = false
|
||||||
);
|
);
|
||||||
|
|
||||||
//- Inplace reorder the elements of a list.
|
//- Inplace reorder the elements of a list.
|
||||||
// Similar to the general templated form, but with auto-vivify
|
// Similar to the general templated form, but with auto-vivify for bitSet.
|
||||||
// for PackedBoolList.
|
|
||||||
void inplaceReorder
|
void inplaceReorder
|
||||||
(
|
(
|
||||||
const labelUList& oldToNew,
|
const labelUList& oldToNew,
|
||||||
PackedBoolList& input,
|
bitSet& input,
|
||||||
const bool prune = false
|
const bool prune = false
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -456,7 +454,7 @@ template<class T>
|
|||||||
void setValue
|
void setValue
|
||||||
(
|
(
|
||||||
UList<T>& list,
|
UList<T>& list,
|
||||||
const PackedBoolList& locations,
|
const bitSet& locations,
|
||||||
const T& val
|
const T& val
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -578,7 +576,7 @@ template<class T>
|
|||||||
List<T> createWithValue
|
List<T> createWithValue
|
||||||
(
|
(
|
||||||
const label len,
|
const label len,
|
||||||
const PackedBoolList& locations,
|
const bitSet& locations,
|
||||||
const T& val,
|
const T& val,
|
||||||
const T& deflt = T()
|
const T& deflt = T()
|
||||||
);
|
);
|
||||||
|
|||||||
@ -128,7 +128,7 @@ void Foam::inplaceReorder
|
|||||||
// the oldToNew map is unique (ie, shuffle)
|
// the oldToNew map is unique (ie, shuffle)
|
||||||
|
|
||||||
// Use const reference to ensure we obtain the proper operator[]
|
// Use const reference to ensure we obtain the proper operator[]
|
||||||
// on lazy lists (eg, List<bool>, PackedBoolList)
|
// on lazy lists (eg, List<bool>, PackedList)
|
||||||
|
|
||||||
const ListType& input = inputOutput;
|
const ListType& input = inputOutput;
|
||||||
const label len = input.size();
|
const label len = input.size();
|
||||||
@ -439,7 +439,7 @@ ListType Foam::subset
|
|||||||
{
|
{
|
||||||
const label len = input.size();
|
const label len = input.size();
|
||||||
|
|
||||||
// select can have a different size (eg, PackedBoolList, labelHashSet)
|
// select can have a different size (eg, bitSet, labelHashSet)
|
||||||
|
|
||||||
ListType output(len);
|
ListType output(len);
|
||||||
output.resize(len); // Consistent sizing (eg, DynamicList)
|
output.resize(len); // Consistent sizing (eg, DynamicList)
|
||||||
@ -468,7 +468,7 @@ void Foam::inplaceSubset
|
|||||||
{
|
{
|
||||||
const label len = input.size();
|
const label len = input.size();
|
||||||
|
|
||||||
// select can have a different size (eg, PackedBoolList, labelHashSet)
|
// select can have a different size (eg, bitSet, labelHashSet)
|
||||||
|
|
||||||
label count = 0;
|
label count = 0;
|
||||||
for (label i=0; i < len; ++i)
|
for (label i=0; i < len; ++i)
|
||||||
@ -979,22 +979,20 @@ template<class T>
|
|||||||
void Foam::ListOps::setValue
|
void Foam::ListOps::setValue
|
||||||
(
|
(
|
||||||
UList<T>& list,
|
UList<T>& list,
|
||||||
const PackedBoolList& locations,
|
const bitSet& locations,
|
||||||
const T& val
|
const T& val
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Need improvements in PackedBoolList for more efficiency
|
|
||||||
|
|
||||||
const label len = list.size();
|
const label len = list.size();
|
||||||
const label count = locations.count();
|
|
||||||
|
|
||||||
for (label index = 0, used = 0; index < len && used < count; ++index)
|
for
|
||||||
|
(
|
||||||
|
label pos = locations.find_first();
|
||||||
|
pos >= 0 && pos < len;
|
||||||
|
pos = locations.find_next(pos)
|
||||||
|
)
|
||||||
{
|
{
|
||||||
if (locations.test(index))
|
list[pos] = val;
|
||||||
{
|
|
||||||
list[index] = val;
|
|
||||||
++used;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1106,7 +1104,7 @@ template<class T>
|
|||||||
Foam::List<T> Foam::ListOps::createWithValue
|
Foam::List<T> Foam::ListOps::createWithValue
|
||||||
(
|
(
|
||||||
const label len,
|
const label len,
|
||||||
const PackedBoolList& locations,
|
const bitSet& locations,
|
||||||
const T& val,
|
const T& val,
|
||||||
const T& deflt
|
const T& deflt
|
||||||
)
|
)
|
||||||
|
|||||||
@ -1,217 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation |
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "PackedBoolList.H"
|
|
||||||
#include "IOstreams.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
bool Foam::PackedBoolList::bitorPrepare
|
|
||||||
(
|
|
||||||
const PackedBoolList& lst,
|
|
||||||
label& maxPackLen
|
|
||||||
)
|
|
||||||
{
|
|
||||||
const StorageList& lhs = this->storage();
|
|
||||||
const StorageList& rhs = lst.storage();
|
|
||||||
|
|
||||||
const label packLen1 = this->packedLength();
|
|
||||||
const label packLen2 = lst.packedLength();
|
|
||||||
|
|
||||||
|
|
||||||
// check how the lists interact and if bit trimming is needed
|
|
||||||
bool needTrim = false;
|
|
||||||
maxPackLen = packLen1;
|
|
||||||
|
|
||||||
if (packLen1 == packLen2)
|
|
||||||
{
|
|
||||||
// identical packed lengths - only resize if absolutely necessary
|
|
||||||
if
|
|
||||||
(
|
|
||||||
this->size() != lst.size()
|
|
||||||
&& maxPackLen
|
|
||||||
&& rhs[maxPackLen-1] > lhs[maxPackLen-1]
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// second list has a higher bit set
|
|
||||||
// extend addressable area and use trim
|
|
||||||
resize(lst.size());
|
|
||||||
needTrim = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (packLen2 < packLen1)
|
|
||||||
{
|
|
||||||
// second list is shorter, this limits the or
|
|
||||||
maxPackLen = packLen2;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// second list is longer, find the highest bit set
|
|
||||||
for (label storeI = packLen1; storeI < packLen2; ++storeI)
|
|
||||||
{
|
|
||||||
if (rhs[storeI])
|
|
||||||
{
|
|
||||||
maxPackLen = storeI+1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the upper limit moved - resize for full coverage and trim later
|
|
||||||
if (maxPackLen > packLen1)
|
|
||||||
{
|
|
||||||
resize(maxPackLen * packing());
|
|
||||||
needTrim = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return needTrim;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class LabelListType>
|
|
||||||
void Foam::PackedBoolList::setIndices(const LabelListType& indices)
|
|
||||||
{
|
|
||||||
const label len = indices.size();
|
|
||||||
|
|
||||||
// No better information, just guess something from the size
|
|
||||||
reserve(len);
|
|
||||||
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
set(indices[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<class LabelListType>
|
|
||||||
void Foam::PackedBoolList::unsetIndices(const LabelListType& indices)
|
|
||||||
{
|
|
||||||
const label len = indices.size();
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
unset(indices[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::PackedBoolList::PackedBoolList(Istream& is)
|
|
||||||
:
|
|
||||||
PackedList<1>()
|
|
||||||
{
|
|
||||||
is >> *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::set(const PackedBoolList& lst)
|
|
||||||
{
|
|
||||||
// extend addressable area if needed, return maximum size possible
|
|
||||||
label len = 0;
|
|
||||||
const bool needTrim = bitorPrepare(lst, len);
|
|
||||||
|
|
||||||
// operate directly with the underlying storage
|
|
||||||
StorageList& lhs = this->storage();
|
|
||||||
const StorageList& rhs = lst.storage();
|
|
||||||
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
lhs[i] |= rhs[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needTrim)
|
|
||||||
{
|
|
||||||
trim();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::unset(const PackedBoolList& lst)
|
|
||||||
{
|
|
||||||
// operate directly with the underlying storage
|
|
||||||
StorageList& lhs = this->storage();
|
|
||||||
const StorageList& rhs = lst.storage();
|
|
||||||
|
|
||||||
// overlapping storage size
|
|
||||||
const label len = min(this->packedLength(), lst.packedLength());
|
|
||||||
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
lhs[i] &= ~rhs[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::setMany(const labelUList& indices)
|
|
||||||
{
|
|
||||||
setIndices(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::setMany(const labelUIndList& indices)
|
|
||||||
{
|
|
||||||
setIndices(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::unsetMany(const labelUList& indices)
|
|
||||||
{
|
|
||||||
unsetIndices(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::PackedBoolList::unsetMany(const labelUIndList& indices)
|
|
||||||
{
|
|
||||||
unsetIndices(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::labelList Foam::PackedBoolList::used() const
|
|
||||||
{
|
|
||||||
// Number of used (set) entries
|
|
||||||
const label cnt = this->count();
|
|
||||||
|
|
||||||
labelList lst(cnt);
|
|
||||||
|
|
||||||
if (cnt)
|
|
||||||
{
|
|
||||||
// The length of the input list
|
|
||||||
const label len = this->size();
|
|
||||||
|
|
||||||
for (label i=0, usedi=0; (i < len && usedi < cnt); ++i)
|
|
||||||
{
|
|
||||||
if (test(i))
|
|
||||||
{
|
|
||||||
lst[usedi++] = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return lst;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,216 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::PackedBoolList
|
|
||||||
|
|
||||||
Description
|
|
||||||
A bit-packed bool list.
|
|
||||||
|
|
||||||
In addition to the obvious memory advantage over using a
|
|
||||||
List\<bool\>, this class also provides a number of bit-like
|
|
||||||
operations.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
PackedBoolListI.H
|
|
||||||
PackedBoolList.C
|
|
||||||
|
|
||||||
See also
|
|
||||||
Foam::PackedList
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef PackedBoolList_H
|
|
||||||
#define PackedBoolList_H
|
|
||||||
|
|
||||||
#include "PackedList.H"
|
|
||||||
#include "UIndirectList.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
// Forward declaration
|
|
||||||
class PackedBoolList;
|
|
||||||
|
|
||||||
//- \typedef A List of PackedBoolList
|
|
||||||
typedef List<PackedBoolList> PackedBoolListList;
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class PackedBoolList Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class PackedBoolList
|
|
||||||
:
|
|
||||||
public PackedList<1>
|
|
||||||
{
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Preparation, resizing before a bitor operation
|
|
||||||
// returns true if the later result needs trimming
|
|
||||||
bool bitorPrepare(const PackedBoolList& lst, label& maxPackLen);
|
|
||||||
|
|
||||||
//- Set the listed indices. Return number of elements changed.
|
|
||||||
// Does auto-vivify for non-existent entries.
|
|
||||||
template<class LabelListType>
|
|
||||||
void setIndices(const LabelListType& indices);
|
|
||||||
|
|
||||||
//- Unset the listed indices. Return number of elements changed.
|
|
||||||
// Never auto-vivify entries.
|
|
||||||
template<class LabelListType>
|
|
||||||
void unsetIndices(const LabelListType& indices);
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
PackedBoolList() = default;
|
|
||||||
|
|
||||||
//- Construct from Istream
|
|
||||||
PackedBoolList(Istream& is);
|
|
||||||
|
|
||||||
//- Construct with given size, initializes list to 0 (false)
|
|
||||||
explicit inline PackedBoolList(const label size);
|
|
||||||
|
|
||||||
//- Construct with given size and value for all elements
|
|
||||||
inline PackedBoolList(const label size, const bool val);
|
|
||||||
|
|
||||||
//- Copy construct
|
|
||||||
inline PackedBoolList(const PackedBoolList& lst);
|
|
||||||
|
|
||||||
//- Move construct
|
|
||||||
inline PackedBoolList(PackedBoolList&& lst);
|
|
||||||
|
|
||||||
//- Construct with given size and list of labels to set as true.
|
|
||||||
inline PackedBoolList(const label size, const labelUList& indices);
|
|
||||||
|
|
||||||
//- Construct with given size and list of labels to set as true.
|
|
||||||
inline PackedBoolList(const label size, const labelUIndList& indices);
|
|
||||||
|
|
||||||
//- Construct from a list of bools
|
|
||||||
explicit inline PackedBoolList(const UList<bool>& lst);
|
|
||||||
|
|
||||||
//- Construct from a list of labels
|
|
||||||
//- using the labels as indices to indicate which bits are set
|
|
||||||
explicit inline PackedBoolList(const labelUList& indices);
|
|
||||||
|
|
||||||
//- Construct from a list of labels
|
|
||||||
//- using the labels as indices to indicate which bits are set
|
|
||||||
explicit inline PackedBoolList(const labelUIndList& indices);
|
|
||||||
|
|
||||||
//- Clone
|
|
||||||
inline autoPtr<PackedBoolList> clone() const;
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
// Query
|
|
||||||
|
|
||||||
//- Test value at specified position.
|
|
||||||
// \note Method name compatibility with std::bitset
|
|
||||||
inline bool test(const label pos) const;
|
|
||||||
|
|
||||||
|
|
||||||
// Access
|
|
||||||
|
|
||||||
//- Single index/value assign
|
|
||||||
using PackedList<1>::set;
|
|
||||||
|
|
||||||
//- Single index unassign
|
|
||||||
using PackedList<1>::unset;
|
|
||||||
|
|
||||||
//- Set specified bits.
|
|
||||||
void set(const PackedBoolList& lst);
|
|
||||||
|
|
||||||
//- Unset specified bits.
|
|
||||||
void unset(const PackedBoolList& lst);
|
|
||||||
|
|
||||||
//- Return indices of the used (true) elements as a list of labels
|
|
||||||
labelList used() const;
|
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
|
||||||
|
|
||||||
//- Transfer the contents of the argument list into this list
|
|
||||||
//- and annul the argument list.
|
|
||||||
inline void transfer(PackedBoolList& lst);
|
|
||||||
|
|
||||||
|
|
||||||
// Convenience Methods
|
|
||||||
|
|
||||||
//- Set the listed indices. Return number of elements changed.
|
|
||||||
// Does auto-vivify for non-existent entries.
|
|
||||||
void setMany(const labelUList& indices);
|
|
||||||
|
|
||||||
//- Set the listed indices. Return number of elements changed.
|
|
||||||
// Does auto-vivify for non-existent entries.
|
|
||||||
void setMany(const labelUIndList& indices);
|
|
||||||
|
|
||||||
//- Unset the listed indices. Return number of elements changed.
|
|
||||||
// Never auto-vivify entries.
|
|
||||||
void unsetMany(const labelUList& indices);
|
|
||||||
|
|
||||||
//- Unset the listed indices. Return number of elements changed.
|
|
||||||
// Never auto-vivify entries.
|
|
||||||
void unsetMany(const labelUIndList& indices);
|
|
||||||
|
|
||||||
|
|
||||||
// Member Operators
|
|
||||||
|
|
||||||
//- Assign all entries to the given value.
|
|
||||||
inline void operator=(const bool val);
|
|
||||||
|
|
||||||
//- Copy assignment
|
|
||||||
inline void operator=(const PackedBoolList& lst);
|
|
||||||
|
|
||||||
//- Move assignment
|
|
||||||
inline void operator=(PackedBoolList&& lst);
|
|
||||||
|
|
||||||
|
|
||||||
// Housekeeping
|
|
||||||
|
|
||||||
//- No assignment from list. Use setMany for that.
|
|
||||||
void operator=(const labelUList&) = delete;
|
|
||||||
|
|
||||||
//- No assignment from list. Use setMany for that.
|
|
||||||
void operator=(const labelUIndList&) = delete;
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#include "PackedBoolListI.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation | Copyright (C) 2017 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(const label size)
|
|
||||||
:
|
|
||||||
PackedList<1>(size)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList
|
|
||||||
(
|
|
||||||
const label size,
|
|
||||||
const bool val
|
|
||||||
)
|
|
||||||
:
|
|
||||||
PackedList<1>(size, (val ? 1u : 0u))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(const PackedBoolList& lst)
|
|
||||||
:
|
|
||||||
PackedList<1>(lst)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(PackedBoolList&& lst)
|
|
||||||
:
|
|
||||||
PackedList<1>()
|
|
||||||
{
|
|
||||||
transfer(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(const UList<bool>& lst)
|
|
||||||
:
|
|
||||||
PackedList<1>(lst.size())
|
|
||||||
{
|
|
||||||
// Set according to indices that are true
|
|
||||||
const label len = lst.size();
|
|
||||||
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
if (lst[i])
|
|
||||||
{
|
|
||||||
this->set(i, 1u);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(const labelUList& indices)
|
|
||||||
:
|
|
||||||
PackedBoolList((indices.size() ? indices.last() : 0), indices)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList(const labelUIndList& indices)
|
|
||||||
:
|
|
||||||
PackedBoolList((indices.size() ? indices.last() : 0), indices)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList
|
|
||||||
(
|
|
||||||
const label size,
|
|
||||||
const labelUList& indices
|
|
||||||
)
|
|
||||||
:
|
|
||||||
PackedList<1>(size)
|
|
||||||
{
|
|
||||||
setMany(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::PackedBoolList::PackedBoolList
|
|
||||||
(
|
|
||||||
const label size,
|
|
||||||
const labelUIndList& indices
|
|
||||||
)
|
|
||||||
:
|
|
||||||
PackedList<1>(size)
|
|
||||||
{
|
|
||||||
setMany(indices);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline Foam::autoPtr<Foam::PackedBoolList>
|
|
||||||
Foam::PackedBoolList::clone() const
|
|
||||||
{
|
|
||||||
return autoPtr<PackedBoolList>::New(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
inline bool Foam::PackedBoolList::test(const label pos) const
|
|
||||||
{
|
|
||||||
return get(pos);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void Foam::PackedBoolList::transfer(PackedBoolList& lst)
|
|
||||||
{
|
|
||||||
PackedList<1>::transfer(static_cast<PackedList<1>&>(lst));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
inline void Foam::PackedBoolList::operator=(const bool val)
|
|
||||||
{
|
|
||||||
PackedList<1>::operator=(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void Foam::PackedBoolList::operator=(const PackedBoolList& lst)
|
|
||||||
{
|
|
||||||
PackedList<1>::operator=(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
inline void Foam::PackedBoolList::operator=(PackedBoolList&& lst)
|
|
||||||
{
|
|
||||||
transfer(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,536 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "PackedList.H"
|
|
||||||
#include "IOstreams.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::writeEntry(Ostream& os) const
|
|
||||||
{
|
|
||||||
os << *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#if (UINT_MAX == 0xFFFFFFFF)
|
|
||||||
// 32-bit counting, Hamming weight method
|
|
||||||
#define COUNT_PACKEDBITS(sum, x) \
|
|
||||||
{ \
|
|
||||||
x -= (x >> 1) & 0x55555555; \
|
|
||||||
x = (x & 0x33333333) + ((x >> 2) & 0x33333333); \
|
|
||||||
sum += (((x + (x >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24; \
|
|
||||||
}
|
|
||||||
#elif (UINT_MAX == 0xFFFFFFFFFFFFFFFF)
|
|
||||||
// 64-bit counting, Hamming weight method
|
|
||||||
#define COUNT_PACKEDBITS(sum, x) \
|
|
||||||
{ \
|
|
||||||
x -= (x >> 1) & 0x5555555555555555; \
|
|
||||||
x = (x & 0x3333333333333333) + ((x >> 2) & 0x3333333333333333); \
|
|
||||||
sum += (((x + (x >> 4)) & 0x0F0F0F0F0F0F0F0F) * 0x0101010101010101) >> 56; \
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
// Arbitrary number of bits, Brian Kernighan's method
|
|
||||||
#define COUNT_PACKEDBITS(sum, x) for (; x; ++sum) { x &= x - 1; }
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
unsigned int Foam::PackedList<nBits>::count() const
|
|
||||||
{
|
|
||||||
unsigned int c = 0;
|
|
||||||
|
|
||||||
if (size_)
|
|
||||||
{
|
|
||||||
const label packLen = packedLength();
|
|
||||||
for (label i = 0; i < packLen; ++i)
|
|
||||||
{
|
|
||||||
unsigned int bits = StorageList::operator[](i);
|
|
||||||
COUNT_PACKEDBITS(c, bits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
#undef COUNT_PACKEDBITS
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
bool Foam::PackedList<nBits>::trim()
|
|
||||||
{
|
|
||||||
if (!size_)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const label oldSize = size_;
|
|
||||||
for (label storeI = packedLength()-1; storeI >= 0; --storeI)
|
|
||||||
{
|
|
||||||
size_ = storeI * packing();
|
|
||||||
unsigned int bits = StorageList::operator[](storeI);
|
|
||||||
|
|
||||||
// found some bits
|
|
||||||
if (bits)
|
|
||||||
{
|
|
||||||
while (bits)
|
|
||||||
{
|
|
||||||
bits >>= nBits;
|
|
||||||
++size_;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return (size_ != oldSize);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::flip()
|
|
||||||
{
|
|
||||||
if (!size_)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// mask value for complete segments
|
|
||||||
const unsigned int mask = maskLower(packing());
|
|
||||||
|
|
||||||
const label packLen = packedLength();
|
|
||||||
for (label i=0; i < packLen; ++i)
|
|
||||||
{
|
|
||||||
StorageList::operator[](i) = mask & ~StorageList::operator[](i);
|
|
||||||
}
|
|
||||||
|
|
||||||
// mask off the final partial segment
|
|
||||||
{
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = size_ / packing();
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::labelList Foam::PackedList<nBits>::values() const
|
|
||||||
{
|
|
||||||
labelList elems(size_);
|
|
||||||
|
|
||||||
for (label i=0; i < size_; ++i)
|
|
||||||
{
|
|
||||||
elems[i] = get(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
return elems;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Ostream& Foam::PackedList<nBits>::printBits
|
|
||||||
(
|
|
||||||
Ostream& os,
|
|
||||||
const bool fullOutput
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const label packLen = packedLength();
|
|
||||||
|
|
||||||
// mask value for complete segments
|
|
||||||
unsigned int mask = maskLower(packing());
|
|
||||||
const label outputLen = fullOutput ? StorageList::size() : packLen;
|
|
||||||
|
|
||||||
os << "(\n";
|
|
||||||
for (label i=0; i < outputLen; ++i)
|
|
||||||
{
|
|
||||||
const StorageType& rawBits = StorageList::operator[](i);
|
|
||||||
|
|
||||||
// the final segment may not be full, modify mask accordingly
|
|
||||||
if (i == packLen-1)
|
|
||||||
{
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
mask = maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (i == packLen)
|
|
||||||
{
|
|
||||||
// no mask for unaddressed bit
|
|
||||||
mask = 0u;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (unsigned int testBit = (1u << max_bits()); testBit; testBit >>= 1)
|
|
||||||
{
|
|
||||||
if (mask & testBit)
|
|
||||||
{
|
|
||||||
// addressable region
|
|
||||||
if (rawBits & testBit)
|
|
||||||
{
|
|
||||||
os << '1';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os << '-';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (rawBits & testBit)
|
|
||||||
{
|
|
||||||
os << '!';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
os << '.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
os << '\n';
|
|
||||||
}
|
|
||||||
os << ")\n";
|
|
||||||
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Ostream& Foam::PackedList<nBits>::printInfo
|
|
||||||
(
|
|
||||||
Ostream& os,
|
|
||||||
const bool fullOutput
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
os << "PackedList<" << nBits << ">"
|
|
||||||
<< " max_value:" << max_value()
|
|
||||||
<< " packing:" << packing() << nl
|
|
||||||
<< " count: " << count() << nl
|
|
||||||
<< " size/capacity: " << size_ << "/" << capacity() << nl
|
|
||||||
<< " storage/capacity: "
|
|
||||||
<< packedLength() << "/" << StorageList::size()
|
|
||||||
<< "\n";
|
|
||||||
|
|
||||||
return printBits(os, fullOutput);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Istream& Foam::PackedList<nBits>::read(Istream& is)
|
|
||||||
{
|
|
||||||
PackedList<nBits>& lst = *this;
|
|
||||||
|
|
||||||
lst.clear();
|
|
||||||
is.fatalCheck(FUNCTION_NAME);
|
|
||||||
|
|
||||||
token firstTok(is);
|
|
||||||
is.fatalCheck
|
|
||||||
(
|
|
||||||
"PackedList::read(Istream&) : "
|
|
||||||
"reading first token"
|
|
||||||
);
|
|
||||||
|
|
||||||
if (firstTok.isLabel())
|
|
||||||
{
|
|
||||||
const label len = firstTok.labelToken();
|
|
||||||
|
|
||||||
// Set list length to that read
|
|
||||||
lst.resize(len);
|
|
||||||
|
|
||||||
// Read list contents depending on data format
|
|
||||||
if (is.format() == IOstream::ASCII)
|
|
||||||
{
|
|
||||||
// Read beginning of contents
|
|
||||||
const char delimiter = is.readBeginList("PackedList");
|
|
||||||
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
if (delimiter == token::BEGIN_LIST)
|
|
||||||
{
|
|
||||||
for (label i=0; i<len; ++i)
|
|
||||||
{
|
|
||||||
lst.set(i, lst.readValue(is));
|
|
||||||
|
|
||||||
is.fatalCheck
|
|
||||||
(
|
|
||||||
"PackedList::read(Istream&) : "
|
|
||||||
"reading entry"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (delimiter == token::BEGIN_BLOCK)
|
|
||||||
{
|
|
||||||
// assign for all entries
|
|
||||||
lst = lst.readValue(is);
|
|
||||||
|
|
||||||
is.fatalCheck
|
|
||||||
(
|
|
||||||
"PackedList::read(Istream&) : "
|
|
||||||
"reading the single entry"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(is)
|
|
||||||
<< "incorrect list token, expected '(' or '{', found "
|
|
||||||
<< firstTok.info()
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Read end of contents
|
|
||||||
is.readEndList("PackedList");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
is.read
|
|
||||||
(
|
|
||||||
reinterpret_cast<char*>(lst.storage().data()),
|
|
||||||
lst.byteSize()
|
|
||||||
);
|
|
||||||
|
|
||||||
is.fatalCheck
|
|
||||||
(
|
|
||||||
"PackedList::read(Istream&) : "
|
|
||||||
"reading the binary block"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (firstTok.isPunctuation())
|
|
||||||
{
|
|
||||||
if (firstTok.pToken() == token::BEGIN_LIST)
|
|
||||||
{
|
|
||||||
token nextTok(is);
|
|
||||||
is.fatalCheck(FUNCTION_NAME);
|
|
||||||
|
|
||||||
while
|
|
||||||
(
|
|
||||||
!( nextTok.isPunctuation()
|
|
||||||
&& nextTok.pToken() == token::END_LIST
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
is.putBack(nextTok);
|
|
||||||
lst.append(lst.readValue(is));
|
|
||||||
|
|
||||||
is >> nextTok;
|
|
||||||
is.fatalCheck(FUNCTION_NAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (firstTok.pToken() == token::BEGIN_BLOCK)
|
|
||||||
{
|
|
||||||
token nextTok(is);
|
|
||||||
is.fatalCheck(FUNCTION_NAME);
|
|
||||||
|
|
||||||
while
|
|
||||||
(
|
|
||||||
!( nextTok.isPunctuation()
|
|
||||||
&& nextTok.pToken() == token::END_BLOCK
|
|
||||||
)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
is.putBack(nextTok);
|
|
||||||
lst.setPair(is);
|
|
||||||
|
|
||||||
is >> nextTok;
|
|
||||||
is.fatalCheck(FUNCTION_NAME);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(is)
|
|
||||||
<< "incorrect first token, expected '(', found "
|
|
||||||
<< firstTok.info()
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(is)
|
|
||||||
<< "incorrect first token, expected <int>, '(' or '{', found "
|
|
||||||
<< firstTok.info()
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Ostream& Foam::PackedList<nBits>::writeList
|
|
||||||
(
|
|
||||||
Ostream& os,
|
|
||||||
const label shortListLen
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
const PackedList<nBits>& lst = *this;
|
|
||||||
const label len = lst.size();
|
|
||||||
|
|
||||||
// Write list contents depending on data format
|
|
||||||
if (os.format() == IOstream::ASCII)
|
|
||||||
{
|
|
||||||
// Can the contents be considered 'uniform' (ie, identical)?
|
|
||||||
bool uniform = (len > 1);
|
|
||||||
if (uniform)
|
|
||||||
{
|
|
||||||
forAll(lst, i)
|
|
||||||
{
|
|
||||||
if (lst[i] != lst[0])
|
|
||||||
{
|
|
||||||
uniform = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (uniform)
|
|
||||||
{
|
|
||||||
// uniform values:
|
|
||||||
os << len << token::BEGIN_BLOCK << lst[0] << token::END_BLOCK;
|
|
||||||
}
|
|
||||||
else if (!shortListLen || len <= shortListLen)
|
|
||||||
{
|
|
||||||
// Shorter list, or line-breaks suppressed
|
|
||||||
os << len << token::BEGIN_LIST;
|
|
||||||
forAll(lst, i)
|
|
||||||
{
|
|
||||||
if (i) os << token::SPACE;
|
|
||||||
os << lst[i];
|
|
||||||
}
|
|
||||||
os << token::END_LIST;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Longer list
|
|
||||||
os << nl << len << nl << token::BEGIN_LIST << nl;
|
|
||||||
forAll(lst, i)
|
|
||||||
{
|
|
||||||
os << lst[i] << nl;
|
|
||||||
}
|
|
||||||
os << token::END_LIST << nl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Contents are binary and contiguous
|
|
||||||
os << nl << len << nl;
|
|
||||||
|
|
||||||
if (len)
|
|
||||||
{
|
|
||||||
// write(...) includes surrounding start/end delimiters
|
|
||||||
os.write
|
|
||||||
(
|
|
||||||
reinterpret_cast<const char*>(lst.storage().cdata()),
|
|
||||||
lst.byteSize()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::writeEntry
|
|
||||||
(
|
|
||||||
const word& keyword,
|
|
||||||
Ostream& os
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
os.writeKeyword(keyword);
|
|
||||||
writeEntry(os);
|
|
||||||
os << token::END_STATEMENT << endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::operator=(const PackedList<nBits>& lst)
|
|
||||||
{
|
|
||||||
StorageList::operator=(lst);
|
|
||||||
size_ = lst.size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::operator=(PackedList<nBits>&& lst)
|
|
||||||
{
|
|
||||||
transfer(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::operator=(const labelUList& lst)
|
|
||||||
{
|
|
||||||
setCapacity(lst.size());
|
|
||||||
size_ = lst.size();
|
|
||||||
|
|
||||||
forAll(lst, i)
|
|
||||||
{
|
|
||||||
set(i, lst[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
void Foam::PackedList<nBits>::operator=(const labelUIndList& lst)
|
|
||||||
{
|
|
||||||
setCapacity(lst.size());
|
|
||||||
size_ = lst.size();
|
|
||||||
|
|
||||||
forAll(lst, i)
|
|
||||||
{
|
|
||||||
set(i, lst[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Istream& Foam::operator>>(Istream& is, PackedList<nBits>& lst)
|
|
||||||
{
|
|
||||||
return lst.read(is);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
Foam::Ostream& Foam::operator<<(Ostream& os, const PackedList<nBits>& lst)
|
|
||||||
{
|
|
||||||
return lst.writeList(os, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -1,730 +0,0 @@
|
|||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
|
||||||
\\ / O peration |
|
|
||||||
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
|
|
||||||
\\/ M anipulation | Copyright (C) 2017-2018 OpenCFD Ltd.
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of OpenFOAM.
|
|
||||||
|
|
||||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
|
||||||
under the terms of the GNU General Public License as published by
|
|
||||||
the Free Software Foundation, either version 3 of the License, or
|
|
||||||
(at your option) any later version.
|
|
||||||
|
|
||||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
|
||||||
for more details.
|
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
|
||||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include <climits>
|
|
||||||
#include "error.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline constexpr unsigned int Foam::PackedList<nBits>::max_bits()
|
|
||||||
{
|
|
||||||
return sizeof(StorageType)*CHAR_BIT - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline constexpr unsigned int Foam::PackedList<nBits>::max_value()
|
|
||||||
{
|
|
||||||
return (1u << nBits) - 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline constexpr unsigned int Foam::PackedList<nBits>::packing()
|
|
||||||
{
|
|
||||||
return sizeof(StorageType)*CHAR_BIT / nBits;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline constexpr unsigned int Foam::PackedList<nBits>::maskLower
|
|
||||||
(
|
|
||||||
unsigned offset
|
|
||||||
)
|
|
||||||
{
|
|
||||||
// Return (1u << (nBits * offset)) - 1;
|
|
||||||
// The next one works more reliably with overflows
|
|
||||||
// eg, when compiled without optimization
|
|
||||||
return (~0u >> (sizeof(StorageType)*CHAR_BIT - nBits * offset));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline constexpr Foam::label Foam::PackedList<nBits>::packedLength
|
|
||||||
(
|
|
||||||
const label nElem
|
|
||||||
)
|
|
||||||
{
|
|
||||||
return (nElem + packing() - 1) / packing();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
// Template specialization for bool entries
|
|
||||||
template<> inline unsigned int PackedList<1>::readValue(Istream& is)
|
|
||||||
{
|
|
||||||
return readBool(is);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Template specialization for bool entries
|
|
||||||
template<> inline void PackedList<1>::setPair(Istream& is)
|
|
||||||
{
|
|
||||||
set(readLabel(is), true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline unsigned int Foam::PackedList<nBits>::readValue(Istream& is)
|
|
||||||
{
|
|
||||||
const unsigned int val = readLabel(is);
|
|
||||||
|
|
||||||
if (val > max_value())
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(is)
|
|
||||||
<< "Out-of-range value " << val << " for PackedList<" << nBits
|
|
||||||
<< ">. Maximum permitted value is " << max_value() << "."
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::setPair(Istream& is)
|
|
||||||
{
|
|
||||||
is.readBegin("Tuple2<label,unsigned int>");
|
|
||||||
|
|
||||||
const label ind = readLabel(is);
|
|
||||||
const unsigned int val = readLabel(is);
|
|
||||||
|
|
||||||
is.readEnd("Tuple2<label,unsigned int>");
|
|
||||||
|
|
||||||
if (val > max_value())
|
|
||||||
{
|
|
||||||
FatalIOErrorInFunction(is)
|
|
||||||
<< "Out-of-range value " << val << " for PackedList<" << nBits
|
|
||||||
<< "> at index " << ind
|
|
||||||
<< ". Maximum permitted value is " << max_value() << "."
|
|
||||||
<< exit(FatalIOError);
|
|
||||||
}
|
|
||||||
|
|
||||||
set(ind, val);
|
|
||||||
|
|
||||||
is.check(FUNCTION_NAME);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList()
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(),
|
|
||||||
size_(0)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(const label size)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(packedLength(size), 0u),
|
|
||||||
size_(size)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList
|
|
||||||
(
|
|
||||||
const label size,
|
|
||||||
const unsigned int val
|
|
||||||
)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(packedLength(size), 0u),
|
|
||||||
size_(size)
|
|
||||||
{
|
|
||||||
if (val)
|
|
||||||
{
|
|
||||||
operator=(val);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(Istream& is)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(),
|
|
||||||
size_(0)
|
|
||||||
{
|
|
||||||
read(is);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(const PackedList<nBits>& lst)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(lst),
|
|
||||||
size_(lst.size_)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(PackedList<nBits>&& lst)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(),
|
|
||||||
size_(0)
|
|
||||||
{
|
|
||||||
transfer(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(const labelUList& lst)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(packedLength(lst.size()), 0u),
|
|
||||||
size_(lst.size())
|
|
||||||
{
|
|
||||||
const label len = lst.size();
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
set(i, lst[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::PackedList(const labelUIndList& lst)
|
|
||||||
:
|
|
||||||
PackedListCore(),
|
|
||||||
StorageList(packedLength(lst.size()), 0u),
|
|
||||||
size_(lst.size())
|
|
||||||
{
|
|
||||||
const label len = lst.size();
|
|
||||||
for (label i = 0; i < len; ++i)
|
|
||||||
{
|
|
||||||
set(i, lst[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::autoPtr<Foam::PackedList<nBits>>
|
|
||||||
Foam::PackedList<nBits>::clone() const
|
|
||||||
{
|
|
||||||
return autoPtr<PackedList<nBits>>::New(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::checkIndex(const label i) const
|
|
||||||
{
|
|
||||||
if (!size_)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "attempt to access element " << i << " from zero sized list"
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
else if (i < 0 || i >= size_)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "index " << i << " out of range [0," << size_ << ")"
|
|
||||||
<< abort(FatalError);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Reference * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::reference::reference
|
|
||||||
(
|
|
||||||
PackedList* list,
|
|
||||||
const label index
|
|
||||||
)
|
|
||||||
:
|
|
||||||
ref_(list->StorageList::operator[](index / packing())),
|
|
||||||
shift_(nBits * (index % packing()))
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline unsigned int Foam::PackedList<nBits>::reference::get() const
|
|
||||||
{
|
|
||||||
return ((ref_ >> shift_) & max_value());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline bool Foam::PackedList<nBits>::reference::set(const unsigned int val)
|
|
||||||
{
|
|
||||||
const unsigned int prev = ref_;
|
|
||||||
|
|
||||||
const unsigned int mask = max_value() << shift_;
|
|
||||||
|
|
||||||
if (val >= max_value())
|
|
||||||
{
|
|
||||||
// Overflow is max_value, fill everything
|
|
||||||
ref_ |= mask;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ref_ &= ~mask;
|
|
||||||
ref_ |= mask & (val << shift_);
|
|
||||||
}
|
|
||||||
|
|
||||||
return (prev != ref_);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::reference::operator=
|
|
||||||
(
|
|
||||||
const reference& other
|
|
||||||
)
|
|
||||||
{
|
|
||||||
this->set(other.get());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::reference::operator=
|
|
||||||
(
|
|
||||||
const unsigned int val
|
|
||||||
)
|
|
||||||
{
|
|
||||||
this->set(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>::reference::operator unsigned int () const
|
|
||||||
{
|
|
||||||
return this->get();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::label Foam::PackedList<nBits>::size() const
|
|
||||||
{
|
|
||||||
return size_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline bool Foam::PackedList<nBits>::empty() const
|
|
||||||
{
|
|
||||||
return !size_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::resize
|
|
||||||
(
|
|
||||||
const label newSize,
|
|
||||||
const unsigned int val
|
|
||||||
)
|
|
||||||
{
|
|
||||||
reserve(newSize);
|
|
||||||
|
|
||||||
const label oldSize = size_;
|
|
||||||
size_ = newSize;
|
|
||||||
|
|
||||||
if (size_ > oldSize)
|
|
||||||
{
|
|
||||||
// Fill new elements or newly exposed elements
|
|
||||||
if (val)
|
|
||||||
{
|
|
||||||
// Fill value for complete segments
|
|
||||||
unsigned int fill = val;
|
|
||||||
|
|
||||||
if (val >= max_value())
|
|
||||||
{
|
|
||||||
// Fill everything
|
|
||||||
fill = maskLower(packing());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (unsigned int i = 1; i < packing(); ++i)
|
|
||||||
{
|
|
||||||
fill |= (fill << nBits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Fill in complete segments
|
|
||||||
const label oldLen = packedLength(oldSize);
|
|
||||||
const label newLen = packedLength(size_);
|
|
||||||
for (label i=oldLen; i < newLen; ++i)
|
|
||||||
{
|
|
||||||
StorageList::operator[](i) = fill;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Finish previous partial segment, preserve existing value
|
|
||||||
{
|
|
||||||
const unsigned int off = oldSize % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = oldSize / packing();
|
|
||||||
const unsigned int mask = maskLower(off);
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= mask;
|
|
||||||
StorageList::operator[](seg) |= ~mask & fill;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mask off the (new) final partial segment
|
|
||||||
{
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = size_ / packing();
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (size_ < oldSize)
|
|
||||||
{
|
|
||||||
// Resize shrinking
|
|
||||||
// - clear newly exposed elements
|
|
||||||
|
|
||||||
// Fill in complete segments
|
|
||||||
const label oldLen = packedLength(oldSize);
|
|
||||||
const label newLen = packedLength(size_);
|
|
||||||
for (label i=newLen; i < oldLen; ++i)
|
|
||||||
{
|
|
||||||
StorageList::operator[](i) = 0u;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mask off the final partial segment
|
|
||||||
{
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = size_ / packing();
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::setSize
|
|
||||||
(
|
|
||||||
const label newSize,
|
|
||||||
const unsigned int val
|
|
||||||
)
|
|
||||||
{
|
|
||||||
resize(newSize, val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::label Foam::PackedList<nBits>::capacity() const
|
|
||||||
{
|
|
||||||
return packing() * StorageList::size();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::setCapacity(const label nElem)
|
|
||||||
{
|
|
||||||
StorageList::setSize(packedLength(nElem), 0u);
|
|
||||||
|
|
||||||
// Truncate addressed size too
|
|
||||||
if (size_ > nElem)
|
|
||||||
{
|
|
||||||
size_ = nElem;
|
|
||||||
|
|
||||||
// Mask off the final partial segment
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = size_ / packing();
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::reserve(const label nElem)
|
|
||||||
{
|
|
||||||
const label len = packedLength(nElem);
|
|
||||||
|
|
||||||
// Allocate more capacity if necessary
|
|
||||||
if (len > StorageList::size())
|
|
||||||
{
|
|
||||||
StorageList::setSize
|
|
||||||
(
|
|
||||||
max
|
|
||||||
(
|
|
||||||
len,
|
|
||||||
// SizeInc=0, SizeMult=2, SizeDiv=1
|
|
||||||
2 * StorageList::size()
|
|
||||||
),
|
|
||||||
0u
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::reset()
|
|
||||||
{
|
|
||||||
StorageList::operator=(0u);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::clear()
|
|
||||||
{
|
|
||||||
reset();
|
|
||||||
size_ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::clearStorage()
|
|
||||||
{
|
|
||||||
StorageList::clear();
|
|
||||||
size_ = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::shrink()
|
|
||||||
{
|
|
||||||
// Any unneeded space allocated?
|
|
||||||
const label len = packedLength();
|
|
||||||
if (len < StorageList::size())
|
|
||||||
{
|
|
||||||
StorageList::setSize(len);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::List<unsigned int>& Foam::PackedList<nBits>::storage()
|
|
||||||
{
|
|
||||||
return static_cast<StorageList&>(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline const Foam::List<unsigned int>& Foam::PackedList<nBits>::storage() const
|
|
||||||
{
|
|
||||||
return static_cast<const StorageList&>(*this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::label Foam::PackedList<nBits>::packedLength() const
|
|
||||||
{
|
|
||||||
return packedLength(size_);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline std::streamsize Foam::PackedList<nBits>::byteSize() const
|
|
||||||
{
|
|
||||||
return packedLength() * sizeof(StorageType);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::transfer(PackedList<nBits>& lst)
|
|
||||||
{
|
|
||||||
size_ = lst.size_;
|
|
||||||
lst.size_ = 0;
|
|
||||||
|
|
||||||
StorageList::transfer(lst);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline unsigned int Foam::PackedList<nBits>::get(const label i) const
|
|
||||||
{
|
|
||||||
// Lazy evaluation - return 0 for out-of-range
|
|
||||||
if (i < 0 || i >= size_)
|
|
||||||
{
|
|
||||||
return 0u;
|
|
||||||
}
|
|
||||||
|
|
||||||
return reference(const_cast<PackedList<nBits>*>(this), i).get();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline bool Foam::PackedList<nBits>::set
|
|
||||||
(
|
|
||||||
const label i,
|
|
||||||
const unsigned int val
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (i < 0)
|
|
||||||
{
|
|
||||||
// Lazy evaluation - ignore out-of-bounds
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
else if (i >= size_)
|
|
||||||
{
|
|
||||||
if (!val)
|
|
||||||
{
|
|
||||||
// Same as unset out-of-bounds = noop
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Lazy evaluation - increase size on assignment
|
|
||||||
resize(i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
return reference(this, i).set(val);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline bool Foam::PackedList<nBits>::unset(const label i)
|
|
||||||
{
|
|
||||||
// Unset out-of-bounds = noop
|
|
||||||
if (i < 0 || i >= size_)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return reference(this, i).set(0u);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline Foam::PackedList<nBits>&
|
|
||||||
Foam::PackedList<nBits>::append(const unsigned int val)
|
|
||||||
{
|
|
||||||
const label idx = size_;
|
|
||||||
reserve(idx + 1);
|
|
||||||
size_++;
|
|
||||||
|
|
||||||
reference(this, idx).set(val);
|
|
||||||
return *this;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline unsigned int Foam::PackedList<nBits>::remove()
|
|
||||||
{
|
|
||||||
// Location of last element and simultaneously the new size
|
|
||||||
const label idx = size_ - 1;
|
|
||||||
|
|
||||||
if (idx < 0)
|
|
||||||
{
|
|
||||||
FatalErrorInFunction
|
|
||||||
<< "List is empty" << abort(FatalError);
|
|
||||||
}
|
|
||||||
|
|
||||||
const unsigned int val = reference(this, idx).get();
|
|
||||||
resize(idx);
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline unsigned int Foam::PackedList<nBits>::operator[](const label i) const
|
|
||||||
{
|
|
||||||
return get(i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline typename Foam::PackedList<nBits>::reference
|
|
||||||
Foam::PackedList<nBits>::operator[](const label i)
|
|
||||||
{
|
|
||||||
// Leave enabled during testing period (MAR-2018)
|
|
||||||
// #ifdef FULLDEBUG
|
|
||||||
checkIndex(i);
|
|
||||||
// #endif
|
|
||||||
return reference(this, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
template<unsigned nBits>
|
|
||||||
inline void Foam::PackedList<nBits>::operator=(const unsigned int val)
|
|
||||||
{
|
|
||||||
const label packLen = packedLength();
|
|
||||||
|
|
||||||
if (val && size_)
|
|
||||||
{
|
|
||||||
unsigned int fill = val;
|
|
||||||
|
|
||||||
if (val >= max_value())
|
|
||||||
{
|
|
||||||
// Fill everything
|
|
||||||
fill = maskLower(packing());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (unsigned int i = 1; i < packing(); ++i)
|
|
||||||
{
|
|
||||||
fill |= (fill << nBits);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (label i=0; i < packLen; ++i)
|
|
||||||
{
|
|
||||||
StorageList::operator[](i) = fill;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Mask off the final partial segment
|
|
||||||
{
|
|
||||||
const unsigned int off = size_ % packing();
|
|
||||||
if (off)
|
|
||||||
{
|
|
||||||
const unsigned int seg = size_ / packing();
|
|
||||||
|
|
||||||
StorageList::operator[](seg) &= maskLower(off);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (label i=0; i < packLen; ++i)
|
|
||||||
{
|
|
||||||
StorageList::operator[](i) = 0u;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
||||||
@ -35,7 +35,7 @@ Description
|
|||||||
#include "IOstreams.H"
|
#include "IOstreams.H"
|
||||||
#include "DynamicList.H"
|
#include "DynamicList.H"
|
||||||
#include "ListOps.H"
|
#include "ListOps.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ Foam::labelList Foam::bandCompression(const labelListList& cellCellAddressing)
|
|||||||
// the business bit of the renumbering
|
// the business bit of the renumbering
|
||||||
SLList<label> nextCell;
|
SLList<label> nextCell;
|
||||||
|
|
||||||
PackedBoolList visited(cellCellAddressing.size());
|
bitSet visited(cellCellAddressing.size());
|
||||||
|
|
||||||
label cellInOrder = 0;
|
label cellInOrder = 0;
|
||||||
|
|
||||||
@ -171,7 +171,7 @@ Foam::labelList Foam::bandCompression
|
|||||||
// the business bit of the renumbering
|
// the business bit of the renumbering
|
||||||
SLList<label> nextCell;
|
SLList<label> nextCell;
|
||||||
|
|
||||||
PackedBoolList visited(offsets.size()-1);
|
bitSet visited(offsets.size()-1);
|
||||||
|
|
||||||
label cellInOrder = 0;
|
label cellInOrder = 0;
|
||||||
|
|
||||||
|
|||||||
@ -29,7 +29,7 @@ Description
|
|||||||
|
|
||||||
#include "cell.H"
|
#include "cell.H"
|
||||||
#include "oppositeFace.H"
|
#include "oppositeFace.H"
|
||||||
#include "boolList.H"
|
#include "bitSet.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -136,7 +136,7 @@ Foam::oppositeFace Foam::cell::opposingFace
|
|||||||
|
|
||||||
// Get cell edges
|
// Get cell edges
|
||||||
const edgeList e = edges(meshFaces);
|
const edgeList e = edges(meshFaces);
|
||||||
boolList usedEdges(e.size(), false);
|
bitSet usedEdges(e.size());
|
||||||
|
|
||||||
oppositeFace oppFace
|
oppositeFace oppFace
|
||||||
(
|
(
|
||||||
@ -151,7 +151,7 @@ Foam::oppositeFace Foam::cell::opposingFace
|
|||||||
// to the slave face
|
// to the slave face
|
||||||
forAll(e, edgeI)
|
forAll(e, edgeI)
|
||||||
{
|
{
|
||||||
if (!usedEdges[edgeI])
|
if (!usedEdges.test(edgeI))
|
||||||
{
|
{
|
||||||
// Get the other vertex
|
// Get the other vertex
|
||||||
label otherVertex = e[edgeI].otherVertex(masterFace[pointi]);
|
label otherVertex = e[edgeI].otherVertex(masterFace[pointi]);
|
||||||
@ -165,7 +165,7 @@ Foam::oppositeFace Foam::cell::opposingFace
|
|||||||
{
|
{
|
||||||
if (slaveFace[slavePointi] == otherVertex)
|
if (slaveFace[slavePointi] == otherVertex)
|
||||||
{
|
{
|
||||||
usedEdges[edgeI] = true;
|
usedEdges.set(edgeI);
|
||||||
oppFace[pointi] = otherVertex;
|
oppFace[pointi] = otherVertex;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|||||||
@ -27,7 +27,6 @@ License
|
|||||||
#include "pointBoundaryMesh.H"
|
#include "pointBoundaryMesh.H"
|
||||||
#include "pointMesh.H"
|
#include "pointMesh.H"
|
||||||
#include "demandDrivenData.H"
|
#include "demandDrivenData.H"
|
||||||
#include "boolList.H"
|
|
||||||
#include "addToRunTimeSelectionTable.H"
|
#include "addToRunTimeSelectionTable.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|||||||
@ -1187,9 +1187,9 @@ void Foam::globalMeshData::calcGlobalEdgeOrientation() const
|
|||||||
// Now check my edges on how they relate to the master's edgeVerts
|
// Now check my edges on how they relate to the master's edgeVerts
|
||||||
globalEdgeOrientationPtr_.reset
|
globalEdgeOrientationPtr_.reset
|
||||||
(
|
(
|
||||||
new PackedBoolList(coupledPatch().nEdges())
|
new bitSet(coupledPatch().nEdges())
|
||||||
);
|
);
|
||||||
PackedBoolList& globalEdgeOrientation = globalEdgeOrientationPtr_();
|
bitSet& globalEdgeOrientation = globalEdgeOrientationPtr_();
|
||||||
|
|
||||||
forAll(coupledPatch().edges(), edgeI)
|
forAll(coupledPatch().edges(), edgeI)
|
||||||
{
|
{
|
||||||
@ -2260,7 +2260,7 @@ const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const Foam::PackedBoolList& Foam::globalMeshData::globalEdgeOrientation() const
|
const Foam::bitSet& Foam::globalMeshData::globalEdgeOrientation() const
|
||||||
{
|
{
|
||||||
if (!globalEdgeOrientationPtr_.valid())
|
if (!globalEdgeOrientationPtr_.valid())
|
||||||
{
|
{
|
||||||
@ -2439,7 +2439,7 @@ Foam::autoPtr<Foam::globalIndex> Foam::globalMeshData::mergePoints
|
|||||||
|
|
||||||
// 1. Count number of masters on my processor.
|
// 1. Count number of masters on my processor.
|
||||||
label nMaster = 0;
|
label nMaster = 0;
|
||||||
PackedBoolList isMaster(mesh_.nPoints(), true);
|
bitSet isMaster(mesh_.nPoints(), true);
|
||||||
forAll(pointSlaves, pointi)
|
forAll(pointSlaves, pointi)
|
||||||
{
|
{
|
||||||
if (masterGlobalPoint[pointi] == -1)
|
if (masterGlobalPoint[pointi] == -1)
|
||||||
|
|||||||
@ -90,14 +90,13 @@ SourceFiles
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
// Forward declaration of friend functions and operators
|
// Forward declarations
|
||||||
|
|
||||||
class polyMesh;
|
class polyMesh;
|
||||||
class mapDistribute;
|
class mapDistribute;
|
||||||
template<class T> class EdgeMap;
|
template<class T> class EdgeMap;
|
||||||
class globalIndex;
|
class globalIndex;
|
||||||
class globalIndexAndTransform;
|
class globalIndexAndTransform;
|
||||||
class PackedBoolList;
|
class bitSet;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class globalMeshData Declaration
|
Class globalMeshData Declaration
|
||||||
@ -171,7 +170,7 @@ class globalMeshData
|
|||||||
mutable autoPtr<globalIndex> globalEdgeNumberingPtr_;
|
mutable autoPtr<globalIndex> globalEdgeNumberingPtr_;
|
||||||
mutable autoPtr<labelListList> globalEdgeSlavesPtr_;
|
mutable autoPtr<labelListList> globalEdgeSlavesPtr_;
|
||||||
mutable autoPtr<labelListList> globalEdgeTransformedSlavesPtr_;
|
mutable autoPtr<labelListList> globalEdgeTransformedSlavesPtr_;
|
||||||
mutable autoPtr<PackedBoolList> globalEdgeOrientationPtr_;
|
mutable autoPtr<bitSet> globalEdgeOrientationPtr_;
|
||||||
mutable autoPtr<mapDistribute> globalEdgeSlavesMapPtr_;
|
mutable autoPtr<mapDistribute> globalEdgeSlavesMapPtr_;
|
||||||
|
|
||||||
|
|
||||||
@ -545,7 +544,7 @@ public:
|
|||||||
const labelListList& globalEdgeTransformedSlaves() const;
|
const labelListList& globalEdgeTransformedSlaves() const;
|
||||||
const mapDistribute& globalEdgeSlavesMap() const;
|
const mapDistribute& globalEdgeSlavesMap() const;
|
||||||
//- Is my edge same orientation as master edge
|
//- Is my edge same orientation as master edge
|
||||||
const PackedBoolList& globalEdgeOrientation() const;
|
const bitSet& globalEdgeOrientation() const;
|
||||||
|
|
||||||
// Collocated point to collocated point
|
// Collocated point to collocated point
|
||||||
|
|
||||||
|
|||||||
@ -70,7 +70,7 @@ bool Foam::polyMesh::checkFaceOrthogonality
|
|||||||
|
|
||||||
|
|
||||||
// Statistics only for internal and masters of coupled faces
|
// Statistics only for internal and masters of coupled faces
|
||||||
PackedBoolList isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
bitSet isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
||||||
|
|
||||||
forAll(ortho, facei)
|
forAll(ortho, facei)
|
||||||
{
|
{
|
||||||
@ -203,7 +203,7 @@ bool Foam::polyMesh::checkFaceSkewness
|
|||||||
label nWarnSkew = 0;
|
label nWarnSkew = 0;
|
||||||
|
|
||||||
// Statistics only for all faces except slave coupled faces
|
// Statistics only for all faces except slave coupled faces
|
||||||
PackedBoolList isMasterFace(syncTools::getMasterFaces(*this));
|
bitSet isMasterFace(syncTools::getMasterFaces(*this));
|
||||||
|
|
||||||
forAll(skew, facei)
|
forAll(skew, facei)
|
||||||
{
|
{
|
||||||
@ -518,7 +518,7 @@ bool Foam::polyMesh::checkFaceWeight
|
|||||||
label nSummed = 0;
|
label nSummed = 0;
|
||||||
|
|
||||||
// Statistics only for internal and masters of coupled faces
|
// Statistics only for internal and masters of coupled faces
|
||||||
PackedBoolList isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
bitSet isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
||||||
|
|
||||||
forAll(faceWght, facei)
|
forAll(faceWght, facei)
|
||||||
{
|
{
|
||||||
@ -605,7 +605,7 @@ bool Foam::polyMesh::checkVolRatio
|
|||||||
label nSummed = 0;
|
label nSummed = 0;
|
||||||
|
|
||||||
// Statistics only for internal and masters of coupled faces
|
// Statistics only for internal and masters of coupled faces
|
||||||
PackedBoolList isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
bitSet isMasterFace(syncTools::getInternalOrMasterFaces(*this));
|
||||||
|
|
||||||
forAll(volRatio, facei)
|
forAll(volRatio, facei)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -62,10 +62,10 @@ void Foam::syncTools::swapBoundaryCellPositions
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::syncTools::getMasterPoints(const polyMesh& mesh)
|
Foam::bitSet Foam::syncTools::getMasterPoints(const polyMesh& mesh)
|
||||||
{
|
{
|
||||||
PackedBoolList isMasterPoint(mesh.nPoints());
|
bitSet isMasterPoint(mesh.nPoints());
|
||||||
PackedBoolList donePoint(mesh.nPoints());
|
bitSet donePoint(mesh.nPoints());
|
||||||
|
|
||||||
const globalMeshData& globalData = mesh.globalData();
|
const globalMeshData& globalData = mesh.globalData();
|
||||||
const labelList& meshPoints = globalData.coupledPatch().meshPoints();
|
const labelList& meshPoints = globalData.coupledPatch().meshPoints();
|
||||||
@ -96,7 +96,7 @@ Foam::PackedBoolList Foam::syncTools::getMasterPoints(const polyMesh& mesh)
|
|||||||
|
|
||||||
forAll(donePoint, pointi)
|
forAll(donePoint, pointi)
|
||||||
{
|
{
|
||||||
if (!donePoint[pointi])
|
if (!donePoint.test(pointi))
|
||||||
{
|
{
|
||||||
isMasterPoint.set(pointi);
|
isMasterPoint.set(pointi);
|
||||||
}
|
}
|
||||||
@ -106,10 +106,10 @@ Foam::PackedBoolList Foam::syncTools::getMasterPoints(const polyMesh& mesh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::syncTools::getMasterEdges(const polyMesh& mesh)
|
Foam::bitSet Foam::syncTools::getMasterEdges(const polyMesh& mesh)
|
||||||
{
|
{
|
||||||
PackedBoolList isMasterEdge(mesh.nEdges());
|
bitSet isMasterEdge(mesh.nEdges());
|
||||||
PackedBoolList doneEdge(mesh.nEdges());
|
bitSet doneEdge(mesh.nEdges());
|
||||||
|
|
||||||
const globalMeshData& globalData = mesh.globalData();
|
const globalMeshData& globalData = mesh.globalData();
|
||||||
const labelList& meshEdges = globalData.coupledPatchMeshEdges();
|
const labelList& meshEdges = globalData.coupledPatchMeshEdges();
|
||||||
@ -140,7 +140,7 @@ Foam::PackedBoolList Foam::syncTools::getMasterEdges(const polyMesh& mesh)
|
|||||||
|
|
||||||
forAll(doneEdge, edgeI)
|
forAll(doneEdge, edgeI)
|
||||||
{
|
{
|
||||||
if (!doneEdge[edgeI])
|
if (!doneEdge.test(edgeI))
|
||||||
{
|
{
|
||||||
isMasterEdge.set(edgeI);
|
isMasterEdge.set(edgeI);
|
||||||
}
|
}
|
||||||
@ -150,9 +150,9 @@ Foam::PackedBoolList Foam::syncTools::getMasterEdges(const polyMesh& mesh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::syncTools::getMasterFaces(const polyMesh& mesh)
|
Foam::bitSet Foam::syncTools::getMasterFaces(const polyMesh& mesh)
|
||||||
{
|
{
|
||||||
PackedBoolList isMasterFace(mesh.nFaces(), true);
|
bitSet isMasterFace(mesh.nFaces(), true);
|
||||||
|
|
||||||
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
||||||
|
|
||||||
@ -177,12 +177,12 @@ Foam::PackedBoolList Foam::syncTools::getMasterFaces(const polyMesh& mesh)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::syncTools::getInternalOrMasterFaces
|
Foam::bitSet Foam::syncTools::getInternalOrMasterFaces
|
||||||
(
|
(
|
||||||
const polyMesh& mesh
|
const polyMesh& mesh
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PackedBoolList isMasterFace(mesh.nFaces(), true);
|
bitSet isMasterFace(mesh.nFaces(), true);
|
||||||
|
|
||||||
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
||||||
|
|
||||||
@ -213,12 +213,12 @@ Foam::PackedBoolList Foam::syncTools::getInternalOrMasterFaces
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Foam::PackedBoolList Foam::syncTools::getInternalOrCoupledFaces
|
Foam::bitSet Foam::syncTools::getInternalOrCoupledFaces
|
||||||
(
|
(
|
||||||
const polyMesh& mesh
|
const polyMesh& mesh
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
PackedBoolList isMasterFace(mesh.nFaces(), true);
|
bitSet isMasterFace(mesh.nFaces(), true);
|
||||||
|
|
||||||
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
const polyBoundaryMesh& patches = mesh.boundaryMesh();
|
||||||
|
|
||||||
|
|||||||
@ -44,7 +44,7 @@ SourceFiles
|
|||||||
|
|
||||||
#include "Pstream.H"
|
#include "Pstream.H"
|
||||||
#include "EdgeMap.H"
|
#include "EdgeMap.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "polyMesh.H"
|
#include "polyMesh.H"
|
||||||
#include "coupledPolyPatch.H"
|
#include "coupledPolyPatch.H"
|
||||||
#include "mapDistribute.H"
|
#include "mapDistribute.H"
|
||||||
@ -590,22 +590,22 @@ public:
|
|||||||
|
|
||||||
//- Get per point whether it is uncoupled or a master of a
|
//- Get per point whether it is uncoupled or a master of a
|
||||||
// coupled set of points
|
// coupled set of points
|
||||||
static PackedBoolList getMasterPoints(const polyMesh&);
|
static bitSet getMasterPoints(const polyMesh&);
|
||||||
|
|
||||||
//- Get per edge whether it is uncoupled or a master of a
|
//- Get per edge whether it is uncoupled or a master of a
|
||||||
// coupled set of edges
|
// coupled set of edges
|
||||||
static PackedBoolList getMasterEdges(const polyMesh&);
|
static bitSet getMasterEdges(const polyMesh&);
|
||||||
|
|
||||||
//- Get per face whether it is uncoupled or a master of a
|
//- Get per face whether it is uncoupled or a master of a
|
||||||
// coupled set of faces
|
// coupled set of faces
|
||||||
static PackedBoolList getMasterFaces(const polyMesh&);
|
static bitSet getMasterFaces(const polyMesh&);
|
||||||
|
|
||||||
//- Get per face whether it is internal or a master of a
|
//- Get per face whether it is internal or a master of a
|
||||||
// coupled set of faces
|
// coupled set of faces
|
||||||
static PackedBoolList getInternalOrMasterFaces(const polyMesh&);
|
static bitSet getInternalOrMasterFaces(const polyMesh&);
|
||||||
|
|
||||||
//- Get per face whether it is internal or coupled
|
//- Get per face whether it is internal or coupled
|
||||||
static PackedBoolList getInternalOrCoupledFaces(const polyMesh&);
|
static bitSet getInternalOrCoupledFaces(const polyMesh&);
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@ -435,12 +435,12 @@ Foam::label Foam::ZoneMesh<ZoneType, MeshType>::findZoneID
|
|||||||
|
|
||||||
|
|
||||||
template<class ZoneType, class MeshType>
|
template<class ZoneType, class MeshType>
|
||||||
Foam::PackedBoolList Foam::ZoneMesh<ZoneType, MeshType>::findMatching
|
Foam::bitSet Foam::ZoneMesh<ZoneType, MeshType>::findMatching
|
||||||
(
|
(
|
||||||
const keyType& key
|
const keyType& key
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
PackedBoolList bitset;
|
bitSet bitset;
|
||||||
|
|
||||||
const labelList indices = this->findIndices(key);
|
const labelList indices = this->findIndices(key);
|
||||||
forAll(indices, i)
|
forAll(indices, i)
|
||||||
|
|||||||
@ -39,7 +39,7 @@ SourceFiles
|
|||||||
#include "regIOobject.H"
|
#include "regIOobject.H"
|
||||||
#include "pointField.H"
|
#include "pointField.H"
|
||||||
#include "Map.H"
|
#include "Map.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "wordRes.H"
|
#include "wordRes.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -180,7 +180,7 @@ public:
|
|||||||
label findZoneID(const word& zoneName) const;
|
label findZoneID(const word& zoneName) const;
|
||||||
|
|
||||||
//- Mark items (cells, faces, points) that match the zone specification
|
//- Mark items (cells, faces, points) that match the zone specification
|
||||||
PackedBoolList findMatching(const keyType& key) const;
|
bitSet findMatching(const keyType& key) const;
|
||||||
|
|
||||||
//- Clear addressing
|
//- Clear addressing
|
||||||
void clearAddressing();
|
void clearAddressing();
|
||||||
|
|||||||
@ -55,8 +55,9 @@ SourceFiles
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
class polyMesh;
|
class polyMesh;
|
||||||
class PackedBoolList;
|
class bitSet;
|
||||||
class boundBox;
|
class boundBox;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
@ -249,7 +250,7 @@ public:
|
|||||||
|
|
||||||
labelList& p1EdgeLabels,
|
labelList& p1EdgeLabels,
|
||||||
labelList& p2EdgeLabels,
|
labelList& p2EdgeLabels,
|
||||||
PackedBoolList& sameOrientation
|
bitSet& sameOrientation
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -91,7 +91,7 @@ void Foam::PatchTools::matchEdges
|
|||||||
|
|
||||||
labelList& p1EdgeLabels,
|
labelList& p1EdgeLabels,
|
||||||
labelList& p2EdgeLabels,
|
labelList& p2EdgeLabels,
|
||||||
PackedBoolList& sameOrientation
|
bitSet& sameOrientation
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
p1EdgeLabels.setSize(p1.nEdges());
|
p1EdgeLabels.setSize(p1.nEdges());
|
||||||
|
|||||||
@ -27,7 +27,7 @@ Description
|
|||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "PatchTools.H"
|
#include "PatchTools.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "boundBox.H"
|
#include "boundBox.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
@ -174,7 +174,7 @@ Foam::PatchTools::subsetMap
|
|||||||
faceMap.setSize(localFaces.size());
|
faceMap.setSize(localFaces.size());
|
||||||
pointMap.setSize(p.nPoints());
|
pointMap.setSize(p.nPoints());
|
||||||
|
|
||||||
boolList pointHad(pointMap.size(), false);
|
bitSet pointHad(pointMap.size(), false);
|
||||||
|
|
||||||
forAll(p, oldFacei)
|
forAll(p, oldFacei)
|
||||||
{
|
{
|
||||||
@ -189,9 +189,8 @@ Foam::PatchTools::subsetMap
|
|||||||
forAll(f, fp)
|
forAll(f, fp)
|
||||||
{
|
{
|
||||||
const label ptLabel = f[fp];
|
const label ptLabel = f[fp];
|
||||||
if (!pointHad[ptLabel])
|
if (pointHad.set(ptLabel))
|
||||||
{
|
{
|
||||||
pointHad[ptLabel] = true;
|
|
||||||
pointMap[pointi++] = ptLabel;
|
pointMap[pointi++] = ptLabel;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,7 +221,7 @@ void Foam::PatchTools::calcBounds
|
|||||||
// ourselves
|
// ourselves
|
||||||
const PointField& points = p.points();
|
const PointField& points = p.points();
|
||||||
|
|
||||||
PackedBoolList pointIsUsed(points.size());
|
bitSet pointIsUsed(points.size());
|
||||||
|
|
||||||
nPoints = 0;
|
nPoints = 0;
|
||||||
bb = boundBox::invertedBox;
|
bb = boundBox::invertedBox;
|
||||||
|
|||||||
@ -66,7 +66,8 @@ SourceFiles
|
|||||||
namespace Foam
|
namespace Foam
|
||||||
{
|
{
|
||||||
|
|
||||||
class PackedBoolList;
|
// Forward declarations
|
||||||
|
class bitSet;
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
/*---------------------------------------------------------------------------*\
|
||||||
Class primitiveMesh Declaration
|
Class primitiveMesh Declaration
|
||||||
@ -296,7 +297,7 @@ protected:
|
|||||||
(
|
(
|
||||||
const vectorField& areas,
|
const vectorField& areas,
|
||||||
const bool report,
|
const bool report,
|
||||||
const PackedBoolList& internalOrCoupledFaces
|
const bitSet& internalOrCoupledFaces
|
||||||
) const;
|
) const;
|
||||||
|
|
||||||
//- Check cells for closedness
|
//- Check cells for closedness
|
||||||
|
|||||||
@ -46,7 +46,7 @@ bool Foam::primitiveMesh::checkClosedBoundary
|
|||||||
(
|
(
|
||||||
const vectorField& areas,
|
const vectorField& areas,
|
||||||
const bool report,
|
const bool report,
|
||||||
const PackedBoolList& internalOrCoupledFaces
|
const bitSet& internalOrCoupledFaces
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
@ -1684,7 +1684,7 @@ bool Foam::primitiveMesh::checkFaceFaces
|
|||||||
|
|
||||||
bool Foam::primitiveMesh::checkClosedBoundary(const bool report) const
|
bool Foam::primitiveMesh::checkClosedBoundary(const bool report) const
|
||||||
{
|
{
|
||||||
return checkClosedBoundary(faceAreas(), report, PackedBoolList());
|
return checkClosedBoundary(faceAreas(), report, bitSet());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -455,7 +455,7 @@ Foam::tmp<Foam::scalarField> Foam::primitiveMeshTools::cellDeterminant
|
|||||||
const primitiveMesh& mesh,
|
const primitiveMesh& mesh,
|
||||||
const Vector<label>& meshD,
|
const Vector<label>& meshD,
|
||||||
const vectorField& faceAreas,
|
const vectorField& faceAreas,
|
||||||
const PackedBoolList& internalOrCoupledFace
|
const bitSet& internalOrCoupledFace
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
// Determine number of dimensions and (for 2D) missing dimension
|
// Determine number of dimensions and (for 2D) missing dimension
|
||||||
|
|||||||
@ -35,7 +35,7 @@ SourceFiles
|
|||||||
#define primitiveMeshTools_H
|
#define primitiveMeshTools_H
|
||||||
|
|
||||||
#include "primitiveMesh.H"
|
#include "primitiveMesh.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -125,7 +125,7 @@ public:
|
|||||||
const primitiveMesh& mesh,
|
const primitiveMesh& mesh,
|
||||||
const Vector<label>& directions,
|
const Vector<label>& directions,
|
||||||
const vectorField& faceAreas,
|
const vectorField& faceAreas,
|
||||||
const PackedBoolList& internalOrCoupledFace
|
const bitSet& internalOrCoupledFace
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -35,7 +35,7 @@ License
|
|||||||
#include "uindirectPrimitivePatch.H"
|
#include "uindirectPrimitivePatch.H"
|
||||||
#include "SortableList.H"
|
#include "SortableList.H"
|
||||||
#include "mergePoints.H"
|
#include "mergePoints.H"
|
||||||
#include "PackedBoolList.H"
|
#include "bitSet.H"
|
||||||
#include "ListOps.H"
|
#include "ListOps.H"
|
||||||
|
|
||||||
#include "ccmInternal.H" // include last to avoid any strange interactions
|
#include "ccmInternal.H" // include last to avoid any strange interactions
|
||||||
@ -1099,7 +1099,7 @@ void Foam::ccm::reader::juggleSolids()
|
|||||||
// Identify solid cells
|
// Identify solid cells
|
||||||
// ~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~
|
||||||
label nSolids = 0;
|
label nSolids = 0;
|
||||||
boolList solidCells(cellTableId_.size(), false);
|
bitSet solidCells(cellTableId_.size(), false);
|
||||||
{
|
{
|
||||||
Map<word> solidMap = cellTable_.solids();
|
Map<word> solidMap = cellTable_.solids();
|
||||||
|
|
||||||
@ -1107,7 +1107,7 @@ void Foam::ccm::reader::juggleSolids()
|
|||||||
{
|
{
|
||||||
if (solidMap.found(cellTableId_[cellI]))
|
if (solidMap.found(cellTableId_[cellI]))
|
||||||
{
|
{
|
||||||
solidCells[cellI] = true;
|
solidCells.set(cellI);
|
||||||
++nSolids;
|
++nSolids;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1130,7 +1130,7 @@ void Foam::ccm::reader::juggleSolids()
|
|||||||
label faceI = patchStarts[patchIndex] + i;
|
label faceI = patchStarts[patchIndex] + i;
|
||||||
label cellI = faceOwner_[faceI];
|
label cellI = faceOwner_[faceI];
|
||||||
|
|
||||||
if (solidCells[cellI])
|
if (solidCells.test(cellI))
|
||||||
{
|
{
|
||||||
++adjustPatch;
|
++adjustPatch;
|
||||||
}
|
}
|
||||||
@ -1186,7 +1186,7 @@ void Foam::ccm::reader::juggleSolids()
|
|||||||
label faceI = patchStarts[patchIndex] + i;
|
label faceI = patchStarts[patchIndex] + i;
|
||||||
label cellI = faceOwner_[faceI];
|
label cellI = faceOwner_[faceI];
|
||||||
|
|
||||||
if (solidCells[cellI])
|
if (solidCells.test(cellI))
|
||||||
{
|
{
|
||||||
oldToNew[faceI] = solidFace++;
|
oldToNew[faceI] = solidFace++;
|
||||||
}
|
}
|
||||||
@ -1213,7 +1213,7 @@ void Foam::ccm::reader::removeUnwanted()
|
|||||||
// Identify fluid/porous/solid cells for removal
|
// Identify fluid/porous/solid cells for removal
|
||||||
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
label nRemove = 0;
|
label nRemove = 0;
|
||||||
boolList removeCells(cellTableId_.size(), false);
|
bitSet removeCells(cellTableId_.size(), false);
|
||||||
|
|
||||||
{
|
{
|
||||||
Map<word> fluidMap = cellTable_.fluids();
|
Map<word> fluidMap = cellTable_.fluids();
|
||||||
@ -1236,7 +1236,7 @@ void Foam::ccm::reader::removeUnwanted()
|
|||||||
: false
|
: false
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
removeCells[cellI] = true;
|
removeCells.set(cellI);
|
||||||
++nRemove;
|
++nRemove;
|
||||||
removeMap.set(tableId, cellTable_.name(tableId));
|
removeMap.set(tableId, cellTable_.name(tableId));
|
||||||
}
|
}
|
||||||
@ -1291,7 +1291,7 @@ void Foam::ccm::reader::removeUnwanted()
|
|||||||
for (label faceI = 0; faceI < nFaces_; ++faceI)
|
for (label faceI = 0; faceI < nFaces_; ++faceI)
|
||||||
{
|
{
|
||||||
label cellI = faceOwner_[faceI];
|
label cellI = faceOwner_[faceI];
|
||||||
if (removeCells[cellI])
|
if (removeCells.test(cellI))
|
||||||
{
|
{
|
||||||
if (faceI < nInternalFaces_)
|
if (faceI < nInternalFaces_)
|
||||||
{
|
{
|
||||||
@ -1356,7 +1356,7 @@ void Foam::ccm::reader::removeUnwanted()
|
|||||||
oldToNew.setSize(nCells_, -1);
|
oldToNew.setSize(nCells_, -1);
|
||||||
for (label cellI = 0; cellI < nCells_; ++cellI)
|
for (label cellI = 0; cellI < nCells_; ++cellI)
|
||||||
{
|
{
|
||||||
if (!removeCells[cellI])
|
if (!removeCells.test(cellI))
|
||||||
{
|
{
|
||||||
if (nCell != cellI)
|
if (nCell != cellI)
|
||||||
{
|
{
|
||||||
@ -1886,7 +1886,7 @@ void Foam::ccm::reader::mergeInplaceInterfaces()
|
|||||||
label nMergedTotal = 0;
|
label nMergedTotal = 0;
|
||||||
|
|
||||||
// Markup points to merge
|
// Markup points to merge
|
||||||
PackedBoolList whichPoints(points_.size());
|
bitSet whichPoints(points_.size());
|
||||||
|
|
||||||
Info<< "interface merge points (tol="
|
Info<< "interface merge points (tol="
|
||||||
<< option().mergeTol() << "):" << endl;
|
<< option().mergeTol() << "):" << endl;
|
||||||
@ -1923,7 +1923,7 @@ void Foam::ccm::reader::mergeInplaceInterfaces()
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The global addresses
|
// The global addresses
|
||||||
labelList addr(whichPoints.used());
|
labelList addr(whichPoints.toc());
|
||||||
|
|
||||||
const UIndirectList<point> pointsToMerge(points_, addr);
|
const UIndirectList<point> pointsToMerge(points_, addr);
|
||||||
|
|
||||||
|
|||||||
@ -222,7 +222,7 @@ void Foam::ensightMesh::correct()
|
|||||||
if (option().useFaceZones())
|
if (option().useFaceZones())
|
||||||
{
|
{
|
||||||
// Mark boundary faces to be excluded from export
|
// Mark boundary faces to be excluded from export
|
||||||
PackedBoolList excludeFace(mesh_.nFaces()); // all false
|
bitSet excludeFace(mesh_.nFaces()); // all false
|
||||||
|
|
||||||
forAll(mesh_.boundaryMesh(), patchi)
|
forAll(mesh_.boundaryMesh(), patchi)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -32,6 +32,7 @@ InClass
|
|||||||
#include "Time.H"
|
#include "Time.H"
|
||||||
#include "SortableList.H"
|
#include "SortableList.H"
|
||||||
#include "pointSet.H"
|
#include "pointSet.H"
|
||||||
|
#include "bitSet.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
@ -594,7 +595,7 @@ void Foam::polyDualMesh::dualPatch
|
|||||||
// 3 : done both
|
// 3 : done both
|
||||||
labelList doneEdgeSide(meshEdges.size(), 0);
|
labelList doneEdgeSide(meshEdges.size(), 0);
|
||||||
|
|
||||||
boolList donePoint(patch.nPoints(), false);
|
bitSet donePoint(patch.nPoints(), false);
|
||||||
|
|
||||||
|
|
||||||
// Do points on edge of patch
|
// Do points on edge of patch
|
||||||
@ -650,7 +651,7 @@ void Foam::polyDualMesh::dualPatch
|
|||||||
dualRegion.append(patch.index());
|
dualRegion.append(patch.index());
|
||||||
|
|
||||||
doneEdgeSide[patchEdgeI] |= bitMask;
|
doneEdgeSide[patchEdgeI] |= bitMask;
|
||||||
donePoint[pointi] = true;
|
donePoint.set(pointi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -663,7 +664,7 @@ void Foam::polyDualMesh::dualPatch
|
|||||||
|
|
||||||
forAll(donePoint, pointi)
|
forAll(donePoint, pointi)
|
||||||
{
|
{
|
||||||
if (!donePoint[pointi])
|
if (!donePoint.test(pointi))
|
||||||
{
|
{
|
||||||
labelList dualFace, featEdgeIndices;
|
labelList dualFace, featEdgeIndices;
|
||||||
|
|
||||||
@ -1496,7 +1497,7 @@ void Foam::polyDualMesh::calcFeatures
|
|||||||
const vectorField& faceNormals = allBoundary.faceNormals();
|
const vectorField& faceNormals = allBoundary.faceNormals();
|
||||||
const labelList& meshPoints = allBoundary.meshPoints();
|
const labelList& meshPoints = allBoundary.meshPoints();
|
||||||
|
|
||||||
boolList isFeatureEdge(edgeFaces.size(), false);
|
bitSet isFeatureEdge(edgeFaces.size(), false);
|
||||||
|
|
||||||
forAll(edgeFaces, edgeI)
|
forAll(edgeFaces, edgeI)
|
||||||
{
|
{
|
||||||
@ -1514,11 +1515,11 @@ void Foam::polyDualMesh::calcFeatures
|
|||||||
<< " has more than 2 faces connected to it:"
|
<< " has more than 2 faces connected to it:"
|
||||||
<< eFaces.size() << endl;
|
<< eFaces.size() << endl;
|
||||||
|
|
||||||
isFeatureEdge[edgeI] = true;
|
isFeatureEdge.set(edgeI);
|
||||||
}
|
}
|
||||||
else if (allRegion[eFaces[0]] != allRegion[eFaces[1]])
|
else if (allRegion[eFaces[0]] != allRegion[eFaces[1]])
|
||||||
{
|
{
|
||||||
isFeatureEdge[edgeI] = true;
|
isFeatureEdge.set(edgeI);
|
||||||
}
|
}
|
||||||
else if
|
else if
|
||||||
(
|
(
|
||||||
@ -1526,7 +1527,7 @@ void Foam::polyDualMesh::calcFeatures
|
|||||||
< featureCos
|
< featureCos
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
isFeatureEdge[edgeI] = true;
|
isFeatureEdge.set(edgeI);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1546,9 +1547,9 @@ void Foam::polyDualMesh::calcFeatures
|
|||||||
|
|
||||||
forAll(pEdges, i)
|
forAll(pEdges, i)
|
||||||
{
|
{
|
||||||
if (isFeatureEdge[pEdges[i]])
|
if (isFeatureEdge.test(pEdges[i]))
|
||||||
{
|
{
|
||||||
nFeatEdges++;
|
++nFeatEdges;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (nFeatEdges > 2)
|
if (nFeatEdges > 2)
|
||||||
@ -1593,7 +1594,7 @@ void Foam::polyDualMesh::calcFeatures
|
|||||||
DynamicList<label> allFeatureEdges(isFeatureEdge.size());
|
DynamicList<label> allFeatureEdges(isFeatureEdge.size());
|
||||||
forAll(isFeatureEdge, edgeI)
|
forAll(isFeatureEdge, edgeI)
|
||||||
{
|
{
|
||||||
if (isFeatureEdge[edgeI])
|
if (isFeatureEdge.test(edgeI))
|
||||||
{
|
{
|
||||||
// Store in mesh edge label.
|
// Store in mesh edge label.
|
||||||
allFeatureEdges.append(meshEdges[edgeI]);
|
allFeatureEdges.append(meshEdges[edgeI]);
|
||||||
|
|||||||
@ -46,7 +46,7 @@ namespace Foam
|
|||||||
|
|
||||||
Foam::label Foam::dynamicRefineFvMesh::count
|
Foam::label Foam::dynamicRefineFvMesh::count
|
||||||
(
|
(
|
||||||
const PackedBoolList& l,
|
const bitSet& l,
|
||||||
const unsigned int val
|
const unsigned int val
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
@ -72,7 +72,7 @@ Foam::label Foam::dynamicRefineFvMesh::count
|
|||||||
|
|
||||||
void Foam::dynamicRefineFvMesh::calculateProtectedCells
|
void Foam::dynamicRefineFvMesh::calculateProtectedCells
|
||||||
(
|
(
|
||||||
PackedBoolList& unrefineableCell
|
bitSet& unrefineableCell
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if (protectedCell_.empty())
|
if (protectedCell_.empty())
|
||||||
@ -426,7 +426,7 @@ Foam::dynamicRefineFvMesh::refine
|
|||||||
// Update numbering of protectedCell_
|
// Update numbering of protectedCell_
|
||||||
if (protectedCell_.size())
|
if (protectedCell_.size())
|
||||||
{
|
{
|
||||||
PackedBoolList newProtectedCell(nCells());
|
bitSet newProtectedCell(nCells());
|
||||||
|
|
||||||
forAll(newProtectedCell, celli)
|
forAll(newProtectedCell, celli)
|
||||||
{
|
{
|
||||||
@ -589,7 +589,7 @@ Foam::dynamicRefineFvMesh::unrefine
|
|||||||
// Update numbering of protectedCell_
|
// Update numbering of protectedCell_
|
||||||
if (protectedCell_.size())
|
if (protectedCell_.size())
|
||||||
{
|
{
|
||||||
PackedBoolList newProtectedCell(nCells());
|
bitSet newProtectedCell(nCells());
|
||||||
|
|
||||||
forAll(newProtectedCell, celli)
|
forAll(newProtectedCell, celli)
|
||||||
{
|
{
|
||||||
@ -692,7 +692,7 @@ void Foam::dynamicRefineFvMesh::selectRefineCandidates
|
|||||||
const scalar lowerRefineLevel,
|
const scalar lowerRefineLevel,
|
||||||
const scalar upperRefineLevel,
|
const scalar upperRefineLevel,
|
||||||
const scalarField& vFld,
|
const scalarField& vFld,
|
||||||
PackedBoolList& candidateCell
|
bitSet& candidateCell
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// Get error per cell. Is -1 (not to be refined) to >0 (to be refined,
|
// Get error per cell. Is -1 (not to be refined) to >0 (to be refined,
|
||||||
@ -725,7 +725,7 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectRefineCells
|
|||||||
(
|
(
|
||||||
const label maxCells,
|
const label maxCells,
|
||||||
const label maxRefinement,
|
const label maxRefinement,
|
||||||
const PackedBoolList& candidateCell
|
const bitSet& candidateCell
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// Every refined cell causes 7 extra cells
|
// Every refined cell causes 7 extra cells
|
||||||
@ -735,7 +735,7 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectRefineCells
|
|||||||
|
|
||||||
// Mark cells that cannot be refined since they would trigger refinement
|
// Mark cells that cannot be refined since they would trigger refinement
|
||||||
// of protected cells (since 2:1 cascade)
|
// of protected cells (since 2:1 cascade)
|
||||||
PackedBoolList unrefineableCell;
|
bitSet unrefineableCell;
|
||||||
calculateProtectedCells(unrefineableCell);
|
calculateProtectedCells(unrefineableCell);
|
||||||
|
|
||||||
// Count current selection
|
// Count current selection
|
||||||
@ -806,7 +806,7 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectRefineCells
|
|||||||
Foam::labelList Foam::dynamicRefineFvMesh::selectUnrefinePoints
|
Foam::labelList Foam::dynamicRefineFvMesh::selectUnrefinePoints
|
||||||
(
|
(
|
||||||
const scalar unrefineLevel,
|
const scalar unrefineLevel,
|
||||||
const PackedBoolList& markedCell,
|
const bitSet& markedCell,
|
||||||
const scalarField& pFld
|
const scalarField& pFld
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
@ -819,7 +819,7 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectUnrefinePoints
|
|||||||
// If we have any protected cells make sure they also are not being
|
// If we have any protected cells make sure they also are not being
|
||||||
// unrefined
|
// unrefined
|
||||||
|
|
||||||
PackedBoolList protectedPoint(nPoints());
|
bitSet protectedPoint(nPoints());
|
||||||
|
|
||||||
if (protectedCell_.size())
|
if (protectedCell_.size())
|
||||||
{
|
{
|
||||||
@ -911,7 +911,7 @@ Foam::labelList Foam::dynamicRefineFvMesh::selectUnrefinePoints
|
|||||||
|
|
||||||
void Foam::dynamicRefineFvMesh::extendMarkedCells
|
void Foam::dynamicRefineFvMesh::extendMarkedCells
|
||||||
(
|
(
|
||||||
PackedBoolList& markedCell
|
bitSet& markedCell
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
// Mark faces using any marked cell
|
// Mark faces using any marked cell
|
||||||
@ -953,7 +953,7 @@ void Foam::dynamicRefineFvMesh::extendMarkedCells
|
|||||||
|
|
||||||
void Foam::dynamicRefineFvMesh::checkEightAnchorPoints
|
void Foam::dynamicRefineFvMesh::checkEightAnchorPoints
|
||||||
(
|
(
|
||||||
PackedBoolList& protectedCell,
|
bitSet& protectedCell,
|
||||||
label& nProtected
|
label& nProtected
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
@ -1277,7 +1277,7 @@ bool Foam::dynamicRefineFvMesh::update()
|
|||||||
readLabel(refineDict.lookup("nBufferLayers"));
|
readLabel(refineDict.lookup("nBufferLayers"));
|
||||||
|
|
||||||
// Cells marked for refinement or otherwise protected from unrefinement.
|
// Cells marked for refinement or otherwise protected from unrefinement.
|
||||||
PackedBoolList refineCell(nCells());
|
bitSet refineCell(nCells());
|
||||||
|
|
||||||
// Determine candidates for refinement (looking at field only)
|
// Determine candidates for refinement (looking at field only)
|
||||||
selectRefineCandidates
|
selectRefineCandidates
|
||||||
@ -1318,7 +1318,7 @@ bool Foam::dynamicRefineFvMesh::update()
|
|||||||
const labelList& cellMap = map().cellMap();
|
const labelList& cellMap = map().cellMap();
|
||||||
const labelList& reverseCellMap = map().reverseCellMap();
|
const labelList& reverseCellMap = map().reverseCellMap();
|
||||||
|
|
||||||
PackedBoolList newRefineCell(cellMap.size());
|
bitSet newRefineCell(cellMap.size());
|
||||||
|
|
||||||
forAll(cellMap, celli)
|
forAll(cellMap, celli)
|
||||||
{
|
{
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user