Files
openfoam/src/OpenFOAM/primitives/Vector/bools/boolVector.H
Mark Olesen c973066646 ENH: supplementary vector comparison methods
- background: for some application it can be useful to have fully
  sorted points. i.e., sorted by x, followed by y, followed by z.

  The default VectorSpace 'operator<' compares *all*
  components. This is seen by the following comparisons

  1.  a = (-2.2 -3.3 -4.4)
      b = (-1.1 -2.2 3.3)

      (a < b) : True
      Each 'a' component is less than each 'b' component

  2.  a = (-2.2 -3.3 -4.4)
      b = (-2.2 3.3 4.4)

      (a < b) : False
      The a.x() is not less than b.x()

  The static definitions 'less_xyz', 'less_yzx', 'less_zxy'
  instead use comparison of the next components as tie breakers
  (like a lexicographic sort).
  - same type of definition that Pair and Tuple2 use.

      a = (-2.2 -3.3 -4.4)
      b = (-2.2 3.3 4.4)

      vector::less_xyz(a, b) : True
      The a.x() == b.x(), but a.y() < b.y()

   They can be used directly as comparators:

      pointField points = ...;

      std::sort(points.begin(), points.end(), vector::less_zxy);

ENH: make VectorSpace named access methods noexcept.

   Since the addressing range is restricted to enumerated offsets
   (eg, X/Y/Z) into storage, always remains in-range.
   Possible to make constexpr with future C++ versions.

STYLE: VectorSpace 'operator>' defined using 'operator<'

- standard rewriting rule
2022-10-31 18:36:14 +01:00

183 lines
5.1 KiB
C++

/*---------------------------------------------------------------------------*\
========= |
\\ / 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 <http://www.gnu.org/licenses/>.
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 Foam_boolVector_H
#define Foam_boolVector_H
#include "FixedList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
namespace Foam
{
/*---------------------------------------------------------------------------*\
Class boolVector Declaration
\*---------------------------------------------------------------------------*/
class boolVector
:
public FixedList<bool, 3>
{
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;
// Component Access
//- The x component
bool x() const { return operator[](boolVector::X); }
//- The y component
bool y() const { return operator[](boolVector::Y); }
//- The z component
bool z() const { return operator[](boolVector::Z); }
//- The x component
bool& x() { return operator[](boolVector::X); }
//- The y component
bool& y() { return operator[](boolVector::Y); }
//- The z component
bool& z() { return operator[](boolVector::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<boolVector> : std::true_type {};
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#include "boolVectorI.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
#endif
// ************************************************************************* //