STYLE: add constexpr to PackedList methods

This commit is contained in:
Mark Olesen
2018-01-04 19:16:15 +01:00
parent f868b11a31
commit 85eb441bea
6 changed files with 151 additions and 16 deletions

View File

@ -0,0 +1,3 @@
Test-bitops.C
EXE = $(FOAM_USER_APPBIN)/Test-bitops

View File

@ -0,0 +1,2 @@
/* EXE_INC = -I$(LIB_SRC)/cfdTools/include */
/* EXE_LIBS = -lfiniteVolume */

View File

@ -0,0 +1,124 @@
/*---------------------------------------------------------------------------*\
========= |
\\ / 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/>.
Description
Test some bit-operations.
\*---------------------------------------------------------------------------*/
#include "bool.H"
#include "IOstreams.H"
#include <algorithm>
#include <type_traits>
#include <limits>
template<typename UIntType, UIntType v, unsigned int n>
struct set_lower_bits
:
public std::integral_constant
<
UIntType,
v | (v >> n) | set_lower_bits<UIntType, v | (v >> n), (n >> 1)>::value
>
{};
template<typename UIntType, UIntType v>
struct set_lower_bits<UIntType, v, 1>
:
public std::integral_constant<UIntType, v | (v >> 1)>
{};
template<typename UIntType, UIntType v>
struct pow2ceil
:
public std::integral_constant
<
UIntType,
set_lower_bits
<
UIntType,
v - 1,
(std::numeric_limits<UIntType>::digits >> 1)
>::value + 1
>
{};
// No quite
template<size_t N>
struct topbit : std::integral_constant<size_t, topbit<(N >> 1)>{} + 1> {};
template<> struct topbit<1> : std::integral_constant<size_t,1> {};
template<> struct topbit<0> : std::integral_constant<size_t,0> {};
using namespace Foam;
template<size_t N>
void printTopbit()
{
std::cout
<<"topbit<" << N << "> : " << topbit<N>::value << '\n';
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
int main(int argc, char *argv[])
{
Info<<"pow2ceil<10>: "
<< pow2ceil<unsigned, 10>::value << nl;
Info<<"pow2ceil<16>: "
<< pow2ceil<unsigned, 16>::value << nl;
Info<<"pow2ceil<369>: "
<< pow2ceil<unsigned, 369>::value << nl;
printTopbit<0>();
printTopbit<1>();
printTopbit<2>();
printTopbit<3>();
printTopbit<4>();
printTopbit<5>();
printTopbit<6>();
printTopbit<7>();
printTopbit<8>();
printTopbit<9>();
printTopbit<10>();
printTopbit<11>();
printTopbit<15>();
printTopbit<16>();
printTopbit<17>();
printTopbit<18>();
Info << "---\nEnd\n" << endl;
return 0;
}
// ************************************************************************* //

View File

@ -124,11 +124,11 @@ public:
explicit inline PackedBoolList(const UList<bool>& lst);
//- Construct from a list of labels
// using the labels as indices to indicate which bits are set
//- 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
//- using the labels as indices to indicate which bits are set
explicit inline PackedBoolList(const labelUIndList& indices);
//- Clone
@ -183,11 +183,11 @@ public:
// Edit
//- Transfer the contents of the argument list into this list
// and annul the argument list.
//- and annul the argument list.
inline void transfer(PackedBoolList& lst);
//- Transfer the contents of the argument list into this list
// and annul the argument list.
//- and annul the argument list.
inline void transfer(PackedList<1>& lst);
//- Transfer contents to the Xfer container
@ -209,11 +209,11 @@ public:
void operator=(const UList<bool>& lst);
//- Assignment operator,
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline void operator=(const labelUList& indices);
//- Assignment operator,
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline void operator=(const labelUIndList& indices);
//- Complement operator
@ -223,11 +223,11 @@ public:
inline PackedBoolList& operator&=(const PackedList<1>& lst);
//- And operator (lists may be dissimilar sizes)
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline PackedBoolList& operator&=(const labelUList& indices);
//- And operator (lists may be dissimilar sizes)
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline PackedBoolList& operator&=(const labelUIndList& indices);
//- Xor operator (lists may be dissimilar sizes)
@ -238,11 +238,11 @@ public:
inline PackedBoolList& operator|=(const PackedList<1>& lst);
//- Or operator (lists may be dissimilar sizes),
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline PackedBoolList& operator|=(const labelUList& indices);
//- Or operator (lists may be dissimilar sizes),
// using the labels as indices to indicate which bits are set
//- using the labels as indices to indicate which bits are set
inline PackedBoolList& operator|=(const labelUIndList& indices);

View File

@ -158,7 +158,7 @@ protected:
// Protected Member Functions
//- Calculate the list length when packed
inline static label packedLength(const label nElem);
inline static constexpr label packedLength(const label nElem);
//- Read a list entry (allows for specialization)
inline static unsigned int readValue(Istream& is);
@ -211,7 +211,7 @@ public:
inline static constexpr unsigned int packing();
//- Masking for all bits below the offset
inline static unsigned int maskLower(unsigned offset);
inline static constexpr unsigned int maskLower(unsigned offset);
// Forward declaration of iterators

View File

@ -49,17 +49,23 @@ inline constexpr unsigned int Foam::PackedList<nBits>::packing()
template<unsigned nBits>
inline unsigned int Foam::PackedList<nBits>::maskLower(unsigned offset)
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));
return (~0u >> (sizeof(StorageType)*CHAR_BIT - nBits * offset));
}
template<unsigned nBits>
inline Foam::label Foam::PackedList<nBits>::packedLength(const label nElem)
inline constexpr Foam::label Foam::PackedList<nBits>::packedLength
(
const label nElem
)
{
return (nElem + packing() - 1) / packing();
}
@ -826,7 +832,6 @@ inline void Foam::PackedList<nBits>::setSize
}
template<unsigned nBits>
inline Foam::label Foam::PackedList<nBits>::capacity() const
{
@ -912,6 +917,7 @@ inline void Foam::PackedList<nBits>::shrink()
}
}
template<unsigned nBits>
inline Foam::List<unsigned int>& Foam::PackedList<nBits>::storage()
{