ENH: add FixedList templated get<unsigned>() methods

- provides fast compile-time indexing for FixedList
  (invalid indices trigger a compiler error).

  This enables noexcept access, which can propagate into various
  other uses (eg, triFace, triPoints, ...)

ENH: add triangle edge vectors
This commit is contained in:
Mark Olesen 2022-11-01 13:57:10 +01:00 committed by Andrew Heather
parent c7e6ae30bf
commit d3e285b48b
22 changed files with 318 additions and 262 deletions

View File

@ -189,6 +189,12 @@ int main(int argc, char *argv[])
<< " hash:" << FixedList<label, 4>::hasher()(list1) << nl
<< " hash:" << Hash<FixedList<label, 4>>()(list1) << nl;
Info<< "get<0>: " << list1.get<0>() << nl;
Info<< "get<1>: " << list1.get<1>() << nl;
Info<< "get<2>: " << list1.get<2>() << nl;
Info<< "get<3>: " << list1.get<3>() << nl;
// Will not compile: Info<< "get<4>: " << list1.get<4>() << nl;
label a[4] = {0, 1, 2, 3};
FixedList<label, 4> list2(a);

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2020 OpenCFD Ltd.
Copyright (C) 2020-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -43,7 +43,7 @@ void print(const boolVector& v)
<< " any:" << Switch::name(v.any())
<< " all:" << Switch::name(v.all())
<< " none:" << Switch::name(v.none())
<< " count:" << v.count() << nl;
<< " on:" << v.count() << " off:" << v.count(false) << nl;
}
@ -68,7 +68,7 @@ int main(int argc, char *argv[])
Info<< nl;
{
boolVector vec{1, 0, 1};
boolVector vec(1, 0, 1);
print(vec);
vec.flip();

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2016-2021 OpenCFD Ltd.
Copyright (C) 2016-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -33,6 +33,7 @@ Description
#include "argList.H"
#include "labelledTri.H"
#include "edge.H"
#include "faceList.H"
#include "triFaceList.H"
#include "pointList.H"
@ -131,10 +132,25 @@ int main(int argc, char *argv[])
testSign(f1, points2, testPoints);
Info<< nl;
triFace t1({1, 2, 3});
// Initializer list
// triFace t1({1, 2, 3});
// Component-wise
{
edge e1(3, 2, 1); // Inadvertent sort!!!
Info<< "edge:" << e1 << nl;
}
// Component-wise
triFace t1(1, 2, 3);
Info<< "triFace:"; faceInfo(t1, points1); Info << nl;
testSign(t1, points1, testPoints);
{
scalarField fld({0, 20, 20, 30});
Info<< "avg:" << t1.average(pointField::null(), fld) << nl;
}
Info<< "triFace:"; faceInfo(t1, points2); Info << nl;
testSign(t1, points2, testPoints);
Info<< nl;

View File

@ -1,3 +1,4 @@
#include "argList.H"
#include "point.H"
#include "triangle.H"
#include "tetrahedron.H"
@ -5,7 +6,7 @@
using namespace Foam;
int main()
int main(int argc, char *argv[])
{
triangle<point, point> tri
(
@ -14,6 +15,12 @@ int main()
vector(1, 1, 0)
);
Info<< "triangle: " << tri << nl
<< " vecA: " << tri.vecA() << nl
<< " vecB: " << tri.vecB() << nl
<< " vecC: " << tri.vecC() << nl
<< endl;
Info<< "tri circumCentre = " << tri.circumCentre() << endl;
Info<< "tri circumRadius = " << tri.circumRadius() << endl;
@ -28,6 +35,8 @@ int main()
Info<< "tet circumCentre = " << tet.circumCentre() << endl;
Info<< "tet circumRadius = " << tet.circumRadius() << endl;
InfoErr<< "Enter four points: " << endl;
vector a(Sin);
vector b(Sin);
vector c(Sin);
@ -36,5 +45,6 @@ int main()
Info<< "tet circumRadius = "
<< tetrahedron<point, point>(a, b, c, d).circumRadius() << endl;
Info<< "\nEnd\n";
return 0;
}

View File

@ -216,6 +216,22 @@ public:
// \note Only meaningful for contiguous data
inline char* data_bytes() noexcept;
//- Number of contiguous bytes for the list data,
// \note Only meaningful for contiguous data
inline static std::streamsize size_bytes() noexcept;
//- Number of contiguous bytes for the list data,
//- runtime FatalError if type is not contiguous
static std::streamsize byteSize();
//- Element access using compile-time indexing
template<unsigned Index>
inline T& get() noexcept;
//- Element access using compile-time indexing
template<unsigned Index>
inline const T& get() const noexcept;
//- Access first element of the list, position [0]
inline T& front() noexcept;
@ -228,14 +244,6 @@ public:
//- Access last element of the list, position [N-1]
inline const T& back() const noexcept;
//- Number of contiguous bytes for the list data,
// \note Only meaningful for contiguous data
inline static std::streamsize size_bytes() noexcept;
//- Number of contiguous bytes for the list data,
//- runtime FatalError if type is not contiguous
static std::streamsize byteSize();
//- Return the forward circular index, i.e. next index
//- which returns to the first at the end of the list
inline label fcIndex(const label i) const;

View File

@ -203,6 +203,24 @@ inline std::streamsize Foam::FixedList<T, N>::size_bytes() noexcept
}
template<class T, unsigned N>
template<unsigned Index>
inline T& Foam::FixedList<T, N>::get() noexcept
{
static_assert(Index < N, "Address outside FixedList range");
return v_[Index];
}
template<class T, unsigned N>
template<unsigned Index>
inline const T& Foam::FixedList<T, N>::get() const noexcept
{
static_assert(Index < N, "Address outside FixedList range");
return v_[Index];
}
template<class T, unsigned N>
inline T& Foam::FixedList<T, N>::front() noexcept
{

View File

@ -108,38 +108,28 @@ public:
// Access
//- The first vertex
label a() const { return labelPair::first(); }
label a() const noexcept { return labelPair::first(); }
//- The second vertex
label b() const { return labelPair::second(); }
label b() const noexcept { return labelPair::second(); }
//- The first vertex
label& a() { return labelPair::first(); }
label& a() noexcept { return labelPair::first(); }
//- The second vertex
label& b() { return labelPair::second(); }
//- The first vertex label
using labelPair::first;
//- The second (last) vertex label
using labelPair::second;
//- The last (second) vertex label
using labelPair::last;
label& b() noexcept { return labelPair::second(); }
//- The start (first) vertex label
label start() const { return labelPair::first(); }
label start() const noexcept { return labelPair::first(); }
//- The end (last/second) vertex label
label end() const { return labelPair::second(); }
label end() const noexcept { return labelPair::second(); }
//- The start (first) vertex label
label& start() { return labelPair::first(); }
label& start() noexcept { return labelPair::first(); }
//- The end (last/second) vertex label
label& end() { return labelPair::second(); }
//- The end (second/last) vertex label
label& end() noexcept { return labelPair::second(); }
//- Return reverse edge as copy.
@ -157,8 +147,11 @@ public:
// No special handling of negative point labels.
inline label maxVertex() const;
//- Return true if the vertices are unique and non-negative.
inline bool valid() const;
//- True if the vertices are unique and non-negative.
inline bool good() const noexcept;
//- True if the vertices are unique and non-negative.
bool valid() const noexcept { return good(); }
//- Return true if point label is found in edge.
// Always false for a negative label.

View File

@ -58,7 +58,7 @@ inline Foam::edge::edge(const labelPair& pair)
inline Foam::edge::edge(const FixedList<label, 2>& list)
:
labelPair(list.first(), list.last())
labelPair(list.get<0>(), list.get<1>())
{}
@ -80,7 +80,7 @@ inline Foam::edge::edge
const FixedList<label, 2>& indices
)
:
labelPair(list[indices.first()], list[indices.last()])
labelPair(list[indices.get<0>()], list[indices.get<1>()])
{}
@ -104,7 +104,7 @@ inline Foam::label Foam::edge::maxVertex() const
}
inline bool Foam::edge::valid() const
inline bool Foam::edge::good() const noexcept
{
return (first() != second() && first() >= 0 && second() >= 0);
}

View File

@ -88,7 +88,7 @@ public:
inline triFace();
//- Construct from three point labels
inline triFace(const label p0, const label p1, const label p2);
inline triFace(const label p0, const label p1, const label p2) noexcept;
//- Construct from an initializer list of three point labels
inline explicit triFace(std::initializer_list<label> list);
@ -112,41 +112,31 @@ public:
// Access
//- The first vertex
label a() const { return operator[](0); }
label a() const noexcept { return get<0>(); }
//- The second vertex
label b() const { return operator[](1); }
label b() const noexcept { return get<1>(); }
//- The third vertex
label c() const { return operator[](2); }
label c() const noexcept { return get<2>(); }
//- The first vertex
label& a() { return operator[](0); }
label& a() noexcept { return get<0>(); }
//- The second vertex
label& b() { return operator[](1); }
label& b() noexcept { return get<1>(); }
//- The third vertex
label& c() { return operator[](2); }
//- The first vertex label
using FixedList<label, 3>::first;
//- The last (third) vertex label
using FixedList<label, 3>::last;
//- The second vertex label
label& second() { return operator[](1); }
//- The second vertex label
label second() const { return operator[](1); }
label& c() noexcept { return get<2>(); }
// Queries
//- Return true if the vertices are unique and non-negative.
inline bool valid() const;
//- True if vertices are unique and non-negative.
inline bool good() const noexcept;
//- True if vertices are unique and non-negative.
bool valid() const noexcept { return good(); }
// Other

View File

@ -67,11 +67,16 @@ inline Foam::triFace::triFace()
{}
inline Foam::triFace::triFace(const label p0, const label p1, const label p2)
inline Foam::triFace::triFace
(
const label p0,
const label p1,
const label p2
) noexcept
{
operator[](0) = p0;
operator[](1) = p1;
operator[](2) = p2;
a() = p0;
b() = p1;
c() = p2;
}
@ -105,13 +110,13 @@ inline Foam::triFace::triFace(Istream& is)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline bool Foam::triFace::valid() const
inline bool Foam::triFace::good() const noexcept
{
return
(
operator[](0) >= 0 && operator[](0) != operator[](1)
&& operator[](1) >= 0 && operator[](1) != operator[](2)
&& operator[](2) >= 0 && operator[](0) != operator[](2)
a() >= 0 && a() != b()
&& b() >= 0 && b() != c()
&& c() >= 0 && c() != a()
);
}
@ -145,7 +150,7 @@ inline Foam::label Foam::triFace::collapse()
inline void Foam::triFace::flip()
{
std::swap(operator[](1), operator[](2));
std::swap(get<1>(), get<2>());
}
@ -153,9 +158,9 @@ inline Foam::pointField Foam::triFace::points(const UList<point>& pts) const
{
pointField p(3);
p[0] = pts[operator[](0)];
p[1] = pts[operator[](1)];
p[2] = pts[operator[](2)];
p[0] = pts[a()];
p[1] = pts[b()];
p[2] = pts[c()];
return p;
}
@ -169,45 +174,25 @@ inline Foam::face Foam::triFace::triFaceFace() const
inline Foam::triPointRef Foam::triFace::tri(const UList<point>& points) const
{
return triPointRef
(
points[operator[](0)],
points[operator[](1)],
points[operator[](2)]
);
return triPointRef(points[a()], points[b()], points[c()]);
}
inline Foam::point Foam::triFace::centre(const UList<point>& points) const
{
return triPointRef::centre
(
points[operator[](0)],
points[operator[](1)],
points[operator[](2)]
);
return triPointRef::centre(points[a()], points[b()], points[c()]);
}
inline Foam::vector Foam::triFace::areaNormal(const UList<point>& points) const
{
return triPointRef::areaNormal
(
points[operator[](0)],
points[operator[](1)],
points[operator[](2)]
);
return triPointRef::areaNormal(points[a()], points[b()], points[c()]);
}
inline Foam::vector Foam::triFace::unitNormal(const UList<point>& points) const
{
return triPointRef::unitNormal
(
points[operator[](0)],
points[operator[](1)],
points[operator[](2)]
);
return triPointRef::unitNormal(points[a()], points[b()], points[c()]);
}
@ -220,12 +205,7 @@ inline Foam::scalar Foam::triFace::mag(const UList<point>& points) const
inline Foam::Pair<Foam::point>
Foam::triFace::box(const UList<point>& points) const
{
return triPointRef::box
(
points[operator[](0)],
points[operator[](1)],
points[operator[](2)]
);
return triPointRef::box(points[a()], points[b()], points[c()]);
}
@ -238,7 +218,7 @@ inline Foam::label Foam::triFace::nTriangles() const noexcept
inline Foam::triFace Foam::triFace::reverseFace() const
{
// The starting points of the original and reverse face are identical.
return triFace(operator[](0), operator[](2), operator[](1));
return triFace(a(), c(), b());
}
@ -433,14 +413,14 @@ inline Foam::edgeList Foam::triFace::edges() const
{
edgeList theEdges(3);
theEdges[0].first() = operator[](0);
theEdges[0].second() = operator[](1);
theEdges[0].first() = a();
theEdges[0].second() = b();
theEdges[1].first() = operator[](1);
theEdges[1].second() = operator[](2);
theEdges[1].first() = b();
theEdges[1].second() = c();
theEdges[2].first() = operator[](2);
theEdges[2].second() = operator[](0);
theEdges[2].first() = c();
theEdges[2].second() = a();
return theEdges;
}
@ -450,14 +430,14 @@ inline Foam::edgeList Foam::triFace::rcEdges() const
{
edgeList theEdges(3);
theEdges[0].first() = operator[](0);
theEdges[0].second() = operator[](2);
theEdges[0].first() = a();
theEdges[0].second() = c();
theEdges[1].first() = operator[](2);
theEdges[1].second() = operator[](1);
theEdges[1].first() = c();
theEdges[1].second() = b();
theEdges[2].first() = operator[](1);
theEdges[2].second() = operator[](0);
theEdges[2].first() = b();
theEdges[2].second() = a();
return theEdges;
}
@ -465,20 +445,20 @@ inline Foam::edgeList Foam::triFace::rcEdges() const
inline int Foam::triFace::edgeDirection(const Foam::edge& e) const
{
if (e.first() == operator[](0))
if (e.first() == a())
{
if (e.second() == operator[](1)) return 1; // Forward
if (e.second() == operator[](2)) return -1; // Reverse
if (e.second() == b()) return 1; // Forward
if (e.second() == c()) return -1; // Reverse
}
if (e.first() == operator[](1))
if (e.first() == b())
{
if (e.second() == operator[](2)) return 1; // Forward
if (e.second() == operator[](0)) return -1; // Reverse
if (e.second() == c()) return 1; // Forward
if (e.second() == a()) return -1; // Reverse
}
if (e.first() == operator[](2))
if (e.first() == c())
{
if (e.second() == operator[](0)) return 1; // Forward
if (e.second() == operator[](1)) return -1; // Reverse
if (e.second() == a()) return 1; // Forward
if (e.second() == b()) return -1; // Reverse
}
return 0; // Not found

View File

@ -39,13 +39,7 @@ Type Foam::triFace::average
// a triangle, do a direct calculation
return
(
(1.0/3.0)
*
(
fld[operator[](0)]
+ fld[operator[](1)]
+ fld[operator[](2)]
)
(1.0/3.0) * (fld[a()] + fld[b()] + fld[c()])
);
}

View File

@ -105,16 +105,16 @@ public:
// Member Functions
//- The first vertex
const point& a() const { return Pair<point>::first(); }
const point& a() const noexcept { return Pair<point>::first(); }
//- The second vertex
const point& b() const { return Pair<point>::second(); }
const point& b() const noexcept { return Pair<point>::second(); }
//- The first vertex
point& a() { return Pair<point>::first(); }
point& a() noexcept { return Pair<point>::first(); }
//- The second vertex
point& b() { return Pair<point>::second(); }
point& b() noexcept { return Pair<point>::second(); }
//- Return as line reference
inline linePointRef ln() const;
@ -148,12 +148,13 @@ class line
{
// Private Data
//- First point
//- Reference to the first line point
PointRef a_;
//- Second point
//- Reference to the second line point
PointRef b_;
public:
// Constructors
@ -189,15 +190,15 @@ public:
//- The second (last) point
PointRef second() const noexcept { return b_; }
//- The last (second) point
PointRef last() const noexcept { return b_; }
//- The start (first) point
PointRef start() const noexcept { return a_; }
//- The end (second) point
PointRef end() const noexcept { return b_; }
//- The last (second) point
PointRef last() const noexcept { return b_; }
// Line properties (static calculations)

View File

@ -43,7 +43,7 @@ inline Foam::linePoints::linePoints
const FixedList<label, 2>& indices
)
:
Pair<point>(points[indices.first()], points[indices.last()])
Pair<point>(points[indices.get<0>()], points[indices.get<1>()])
{}
@ -66,8 +66,8 @@ inline Foam::line<Point, PointRef>::line
const FixedList<label, 2>& indices
)
:
a_(points[indices.first()]),
b_(points[indices.last()])
a_(points[indices.template get<0>()]),
b_(points[indices.template get<1>()])
{}

View File

@ -126,28 +126,28 @@ public:
// Member Functions
//- The first vertex
const point& a() const { return operator[](0); }
const point& a() const noexcept { return get<0>(); }
//- The second vertex
const point& b() const { return operator[](1); }
const point& b() const noexcept { return get<1>(); }
//- The third vertex
const point& c() const { return operator[](2); }
const point& c() const noexcept { return get<2>(); }
//- The fourth vertex
const point& d() const { return operator[](3); }
const point& d() const noexcept { return get<3>(); }
//- The first vertex
point& a() { return operator[](0); }
point& a() noexcept { return get<0>(); }
//- The second vertex
point& b() { return operator[](1); }
point& b() noexcept { return get<1>(); }
//- The third vertex
point& c() { return operator[](2); }
point& c() noexcept { return get<2>(); }
//- The fourth vertex
point& d() { return operator[](3); }
point& d() noexcept { return get<3>(); }
//- Return as tetrahedron reference
inline tetPointRef tet() const;

View File

@ -40,19 +40,19 @@ inline Foam::tetPoints::tetPoints
const point& p3
)
{
operator[](0) = p0;
operator[](1) = p1;
operator[](2) = p2;
operator[](3) = p3;
a() = p0;
b() = p1;
c() = p2;
d() = p3;
}
inline Foam::tetPoints::tetPoints(const tetPointRef& pts)
{
operator[](0) = pts.a();
operator[](1) = pts.b();
operator[](2) = pts.c();
operator[](3) = pts.d();
a() = pts.a();
b() = pts.b();
c() = pts.c();
d() = pts.d();
}
@ -94,10 +94,10 @@ inline Foam::tetrahedron<Point, PointRef>::tetrahedron
const FixedList<Point, 4>& pts
)
:
a_(pts[0]),
b_(pts[1]),
c_(pts[2]),
d_(pts[3])
a_(pts.template get<0>()),
b_(pts.template get<1>()),
c_(pts.template get<2>()),
d_(pts.template get<3>())
{}
@ -108,10 +108,10 @@ inline Foam::tetrahedron<Point, PointRef>::tetrahedron
const FixedList<label, 4>& indices
)
:
a_(points[indices[0]]),
b_(points[indices[1]]),
c_(points[indices[2]]),
d_(points[indices[3]])
a_(points[indices.template get<0>()]),
b_(points[indices.template get<1>()]),
c_(points[indices.template get<2>()]),
d_(points[indices.template get<3>()])
{}

View File

@ -114,22 +114,22 @@ public:
// Member Functions
//- The first vertex
const point& a() const { return operator[](0); }
const point& a() const noexcept { return get<0>(); }
//- The second vertex
const point& b() const { return operator[](1); }
const point& b() const noexcept { return get<1>(); }
//- The third vertex
const point& c() const { return operator[](2); }
const point& c() const noexcept { return get<2>(); }
//- The first vertex
point& a() { return operator[](0); }
point& a() noexcept { return get<0>(); }
//- The second vertex
point& b() { return operator[](1); }
point& b() noexcept { return get<1>(); }
//- The third vertex
point& c() { return operator[](2); }
point& c() noexcept { return get<2>(); }
//- Flip triangle orientation by swapping second and third vertices
inline void flip();
@ -154,6 +154,15 @@ public:
//- The enclosing (bounding) box for the triangle
inline Pair<point> box() const;
//- Edge vector opposite point a(): from b() to c()
inline vector vecA() const;
//- Edge vector opposite point b(): from c() to a()
inline vector vecB() const;
//- Edge vector opposite point c(): from a() to b()
inline vector vecC() const;
};
@ -224,7 +233,14 @@ private:
// Private Data
PointRef a_, b_, c_;
//- Reference to the first triangle point
PointRef a_;
//- Reference to the second triangle point
PointRef b_;
//- Reference to the third triangle point
PointRef c_;
// Private Member Functions
@ -322,30 +338,42 @@ public:
);
// Properties
// Properties
//- Return centre (centroid)
inline Point centre() const;
//- Return centre (centroid)
inline Point centre() const;
//- The area normal - with magnitude equal to area of triangle
inline vector areaNormal() const;
//- The area normal - with magnitude equal to area of triangle
inline vector areaNormal() const;
//- Return unit normal
inline vector unitNormal() const;
//- Return unit normal
inline vector unitNormal() const;
//- Legacy name for areaNormal().
// \deprecated(2018-06) Deprecated for new use
FOAM_DEPRECATED_FOR(2018-12, "areaNormal() or unitNormal()")
vector normal() const
{
return areaNormal();
}
//- Legacy name for areaNormal().
// \deprecated(2018-06) Deprecated for new use
FOAM_DEPRECATED_FOR(2018-12, "areaNormal() or unitNormal()")
vector normal() const
{
return areaNormal();
}
//- The magnitude of the triangle area
inline scalar mag() const;
//- The magnitude of the triangle area
inline scalar mag() const;
//- The enclosing (bounding) box for the triangle
inline Pair<Point> box() const;
//- The enclosing (bounding) box for the triangle
inline Pair<Point> box() const;
//- Edge vector opposite point a(): from b() to c()
inline Point vecA() const;
//- Edge vector opposite point b(): from c() to a()
inline Point vecB() const;
//- Edge vector opposite point c(): from a() to b()
inline Point vecC() const;
// Properties
//- Return circum-centre
inline Point circumCentre() const;

View File

@ -39,17 +39,17 @@ inline Foam::triPoints::triPoints
const point& p2
)
{
operator[](0) = p0;
operator[](1) = p1;
operator[](2) = p2;
a() = p0;
b() = p1;
c() = p2;
}
inline Foam::triPoints::triPoints(const triPointRef& pts)
{
operator[](0) = pts.a();
operator[](1) = pts.b();
operator[](2) = pts.c();
a() = pts.a();
b() = pts.b();
c() = pts.c();
}
@ -89,9 +89,9 @@ inline Foam::triangle<Point, PointRef>::triangle
const FixedList<Point, 3>& pts
)
:
a_(pts[0]),
b_(pts[1]),
c_(pts[2])
a_(pts.template get<0>()),
b_(pts.template get<1>()),
c_(pts.template get<2>())
{}
@ -102,9 +102,9 @@ inline Foam::triangle<Point, PointRef>::triangle
const FixedList<label, 3>& indices
)
:
a_(points[indices[0]]),
b_(points[indices[1]]),
c_(points[indices[2]])
a_(points[indices.template get<0>()]),
b_(points[indices.template get<1>()]),
c_(points[indices.template get<2>()])
{}
@ -223,6 +223,43 @@ inline Foam::Pair<Foam::point> Foam::triPoints::box() const
}
template<class Point, class PointRef>
inline Point Foam::triangle<Point, PointRef>::vecA() const
{
return Point(c_ - b_);
}
template<class Point, class PointRef>
inline Point Foam::triangle<Point, PointRef>::vecB() const
{
return Point(a_ - c_);
}
template<class Point, class PointRef>
inline Point Foam::triangle<Point, PointRef>::vecC() const
{
return Point(b_ - a_);
}
inline Foam::vector Foam::triPoints::vecA() const
{
return vector(c() - b());
}
inline Foam::vector Foam::triPoints::vecB() const
{
return vector(a() - c());
}
inline Foam::vector Foam::triPoints::vecC() const
{
return vector(b() - a());
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline Foam::triPointRef Foam::triPoints::tri() const

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2020 OpenCFD Ltd.
Copyright (C) 2020-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -112,17 +112,17 @@ public:
//- True if all components are set
//
// \note Method name compatibility with bitSet
inline bool all() const;
inline bool all() const noexcept;
//- True if any components are set
//
// \note Method name compatibility with bitSet
inline bool any() const;
inline bool any() const noexcept;
//- True if no components are set
//
// \note Method name compatibility with bitSet
inline bool none() const;
inline bool none() const noexcept;
//- Count number of items set.
// \param on can be set to false to count the number of unset bits
@ -135,22 +135,22 @@ public:
// Component Access
//- The x component
bool x() const { return operator[](boolVector::X); }
bool x() const noexcept { return get<0>(); }
//- The y component
bool y() const { return operator[](boolVector::Y); }
bool y() const noexcept { return get<1>(); }
//- The z component
bool z() const { return operator[](boolVector::Z); }
bool z() const noexcept { return get<2>(); }
//- The x component
bool& x() { return operator[](boolVector::X); }
bool& x() noexcept { return get<0>(); }
//- The y component
bool& y() { return operator[](boolVector::Y); }
bool& y() noexcept { return get<1>(); }
//- The z component
bool& z() { return operator[](boolVector::Z); }
bool& z() noexcept { return get<2>(); }
// Edit

View File

@ -5,7 +5,7 @@
\\ / A nd | www.openfoam.com
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2020 OpenCFD Ltd.
Copyright (C) 2020-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -45,8 +45,6 @@ inline Foam::boolVector::boolVector
const bool vy,
const bool vz
)
:
FixedList<bool, 3>()
{
x() = vx;
y() = vy;
@ -62,27 +60,19 @@ inline Foam::boolVector::boolVector(Istream& is)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline bool Foam::boolVector::all() const
inline bool Foam::boolVector::all() const noexcept
{
for (const bool val : *this)
{
if (!val) return false;
}
return true;
return (x() && y() && z());
}
inline bool Foam::boolVector::any() const
inline bool Foam::boolVector::any() const noexcept
{
for (const bool val : *this)
{
if (val) return true;
}
return false;
return (x() || y() || z());
}
inline bool Foam::boolVector::none() const
inline bool Foam::boolVector::none() const noexcept
{
return !any();
}
@ -109,10 +99,9 @@ inline unsigned int Foam::boolVector::count(const bool on) const
inline void Foam::boolVector::flip()
{
for (bool& val : *this)
{
val = !val;
}
x() = !x();
y() = !y();
z() = !z();
}

View File

@ -6,7 +6,7 @@
\\/ M anipulation |
-------------------------------------------------------------------------------
Copyright (C) 2011-2016 OpenFOAM Foundation
Copyright (C) 2017-2021 OpenCFD Ltd.
Copyright (C) 2017-2022 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
@ -113,17 +113,17 @@ public:
// Access
//- Return first element
using FixedList<T, 2>::first;
//- Access the first element
const T& first() const noexcept { return this->template get<0>(); }
//- Return last element
using FixedList<T, 2>::last;
//- Access the first element
T& first() noexcept { return this->template get<0>(); }
//- Return second element, which is also the last element
inline const T& second() const noexcept;
//- Access the second element
const T& second() const noexcept { return this->template get<1>(); }
//- Return second element, which is also the last element
inline T& second() noexcept;
//- Access the second element
T& second() noexcept { return this->template get<1>(); }
//- Return other element
inline const T& other(const T& a) const;

View File

@ -103,7 +103,7 @@ inline Foam::Pair<T>::Pair(const T& f, const T& s, const bool doSort)
template<class T>
inline Foam::Pair<T>::Pair(const FixedList<T, 2>& list, const bool doSort)
:
Pair<T>(list.first(), list.last(), doSort)
Pair<T>(list.template get<0>(), list.template get<1>(), doSort)
{}
@ -116,20 +116,6 @@ inline Foam::Pair<T>::Pair(Istream& is)
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
template<class T>
inline const T& Foam::Pair<T>::second() const noexcept
{
return last();
}
template<class T>
inline T& Foam::Pair<T>::second() noexcept
{
return last();
}
template<class T>
inline const T& Foam::Pair<T>::other(const T& val) const
{

View File

@ -117,16 +117,16 @@ public:
// Member Functions
//- Return first
//- Access the first element
const T1& first() const noexcept { return f_; }
//- Return first
//- Access the first element
T1& first() noexcept { return f_; }
//- Return second
//- Access the second element
const T2& second() const noexcept { return s_; }
//- Return second
//- Access the second element
T2& second() noexcept { return s_; }
};