From ea4c8f4beaa37728ce01ec309f0d7aa75285aa0e Mon Sep 17 00:00:00 2001 From: Mark Olesen Date: Thu, 4 Jun 2020 16:54:30 +0200 Subject: [PATCH] ENH: boolVector for specialized bundling of boolean values - bundled of boolean values as a vector of 3 components with element access using x(), y() and z() member functions. It also has some methods similar to bitSet. - Not derived from Vector or VectorSpace since it does not share very many vector-like characteristics. --- applications/test/boolVector/Make/files | 3 + applications/test/boolVector/Make/options | 2 + .../test/boolVector/Test-boolVector.C | 89 +++++++++ .../primitives/Vector/boolVector/boolVector.H | 182 ++++++++++++++++++ .../Vector/boolVector/boolVectorI.H | 136 +++++++++++++ 5 files changed, 412 insertions(+) create mode 100644 applications/test/boolVector/Make/files create mode 100644 applications/test/boolVector/Make/options create mode 100644 applications/test/boolVector/Test-boolVector.C create mode 100644 src/OpenFOAM/primitives/Vector/boolVector/boolVector.H create mode 100644 src/OpenFOAM/primitives/Vector/boolVector/boolVectorI.H diff --git a/applications/test/boolVector/Make/files b/applications/test/boolVector/Make/files new file mode 100644 index 0000000000..c0b1181aaf --- /dev/null +++ b/applications/test/boolVector/Make/files @@ -0,0 +1,3 @@ +Test-boolVector.C + +EXE = $(FOAM_USER_APPBIN)/Test-boolVector diff --git a/applications/test/boolVector/Make/options b/applications/test/boolVector/Make/options new file mode 100644 index 0000000000..18e6fe47af --- /dev/null +++ b/applications/test/boolVector/Make/options @@ -0,0 +1,2 @@ +/* EXE_INC = */ +/* EXE_LIBS = */ diff --git a/applications/test/boolVector/Test-boolVector.C b/applications/test/boolVector/Test-boolVector.C new file mode 100644 index 0000000000..0c66d261f6 --- /dev/null +++ b/applications/test/boolVector/Test-boolVector.C @@ -0,0 +1,89 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 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 . + +Application + Test-boolVector + +Description + Some simple tests for boolVector + +\*---------------------------------------------------------------------------*/ + +#include "boolVector.H" +#include "IOstreams.H" +#include "Switch.H" + +using namespace Foam; + +void print(const boolVector& v) +{ + Info<< v + << " any:" << Switch::name(v.any()) + << " all:" << Switch::name(v.all()) + << " none:" << Switch::name(v.none()) + << " count:" << v.count() << nl; +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +// Main program: + +int main(int argc, char *argv[]) +{ + Info<< "boolVector" << nl + << " size = " << boolVector::size() << nl + << " contiguous = " << is_contiguous::value << nl + << nl; + + { + boolVector vec; + Info<< "null: " << vec << nl; + } + + Info<< "false: " << boolVector(false) << nl; + Info<< "true: " << boolVector(true) << nl; + Info<< "zero: " << boolVector(Zero) << nl; + Info<< nl; + + { + boolVector vec{1, 0, 1}; + print(vec); + + vec.flip(); + print(vec); + + vec = false; + print(vec); + + vec = true; + print(vec); + } + + Info<< "\nEnd\n" << nl; + + return 0; +} + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // diff --git a/src/OpenFOAM/primitives/Vector/boolVector/boolVector.H b/src/OpenFOAM/primitives/Vector/boolVector/boolVector.H new file mode 100644 index 0000000000..c7bac73011 --- /dev/null +++ b/src/OpenFOAM/primitives/Vector/boolVector/boolVector.H @@ -0,0 +1,182 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 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 . + +Class + Foam::boolVector + +Description + Specialized bundling of boolean values as a vector of 3 components, + element access using x(), y() and z() member functions. + It also has some methods similar to bitSet. + +Note + The boolVector is not derived from Vector or VectorSpace since + it does not share very many vector-like characteristics. + +SourceFiles + boolVectorI.H + +\*---------------------------------------------------------------------------*/ + +#ifndef boolVector_H +#define boolVector_H + +#include "FixedList.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class boolVector Declaration +\*---------------------------------------------------------------------------*/ + +class boolVector +: + public FixedList +{ +public: + + // Member Constants + + //- Rank of a vector is 1 + static constexpr direction rank = 1; + + //- Component labeling enumeration + enum components { X, Y, Z }; + + + // Generated Methods + + //- Copy construct + boolVector(const boolVector&) = default; + + //- Copy assignment + boolVector& operator=(const boolVector&) = default; + + //- Move construct + boolVector(boolVector&&) = default; + + //- Move assignment + boolVector& operator=(boolVector&&) = default; + + + // Constructors + + //- Default construct, zero-initialized (ie, false) + inline boolVector(); + + //- Uniform construct with specified value + inline explicit boolVector(const bool val); + + //- Construct from three components + inline boolVector(const bool vx, const bool vy, const bool vz); + + //- Construct from Istream + inline explicit boolVector(Istream& is); + + + // Member Functions + + // Query + + //- True if all components are set + // + // \note Method name compatibility with bitSet + inline bool all() const; + + //- True if any components are set + // + // \note Method name compatibility with bitSet + inline bool any() const; + + //- True if no components are set + // + // \note Method name compatibility with bitSet + inline bool none() const; + + //- Count number of items set. + // \param on can be set to false to count the number of unset bits + // instead. + // + // \note Method name compatibility with bitSet + inline unsigned int count(const bool on=true) const; + + + // Access + + //- The x component + inline bool x() const; + + //- The y component + inline bool y() const; + + //- The z component + inline bool z() const; + + //- The x component + inline bool& x(); + + //- The y component + inline bool& y(); + + //- The z component + inline bool& z(); + + + // Edit + + //- Invert all values + // + // \note Method name compatibility with bitSet + inline void flip(); + + + // Operators + + //- Assignment of all entries to the given value + inline void operator=(const bool value); +}; + +// * * * * * * * * * * * * * * * * * Traits * * * * * * * * * * * * * * * * // + +//- A boolVector is contiguous (FixedList of bool) +template<> struct is_contiguous : std::true_type {}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#include "boolVectorI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // diff --git a/src/OpenFOAM/primitives/Vector/boolVector/boolVectorI.H b/src/OpenFOAM/primitives/Vector/boolVector/boolVectorI.H new file mode 100644 index 0000000000..f88b12341e --- /dev/null +++ b/src/OpenFOAM/primitives/Vector/boolVector/boolVectorI.H @@ -0,0 +1,136 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2020 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 . + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +inline Foam::boolVector::boolVector() +: + FixedList(false) +{} + + +inline Foam::boolVector::boolVector(const bool val) +: + FixedList(val) +{} + + +inline Foam::boolVector::boolVector +( + const bool vx, + const bool vy, + const bool vz +) +: + FixedList() +{ + x() = vx; + y() = vy; + z() = vz; +} + + +inline Foam::boolVector::boolVector(Istream& is) +: + FixedList(is) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline bool Foam::boolVector::all() const +{ + for (const bool val : *this) + { + if (!val) return false; + } + return true; +} + + +inline bool Foam::boolVector::any() const +{ + for (const bool val : *this) + { + if (val) return true; + } + return false; +} + + +inline bool Foam::boolVector::none() const +{ + return !any(); +} + + +inline unsigned int Foam::boolVector::count(const bool on) const +{ + unsigned int total = 0; + + for (const bool val : *this) + { + if (val) ++total; + } + + if (!on) + { + // Return the number of bits that are OFF. + return (3u - total); + } + + return total; +} + + +inline bool Foam::boolVector::x() const { return operator[](boolVector::X); } +inline bool Foam::boolVector::y() const { return operator[](boolVector::Y); } +inline bool Foam::boolVector::z() const { return operator[](boolVector::Z); } + +inline bool& Foam::boolVector::x() { return operator[](boolVector::X); } +inline bool& Foam::boolVector::y() { return operator[](boolVector::Y); } +inline bool& Foam::boolVector::z() { return operator[](boolVector::Z); } + + +inline void Foam::boolVector::flip() +{ + for (bool& val : *this) + { + val = !val; + } +} + + +// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * // + +inline void Foam::boolVector::operator=(const bool value) +{ + FixedList::operator=(value); +} + + +// ************************************************************************* //