ENH: add identity(IntRange) and Istream operator for common types

- provides consistency with identity(label, label) and looks more
  familiar than using labelRange::labels()

- relocates labelRange IO operators to IntRange

ENH: make sliceRange interators random access

STYLE: scalarRanges::match() instead of predicate operator
This commit is contained in:
Mark Olesen
2020-09-28 17:13:19 +02:00
parent 27e71c2d9e
commit 56c9134ccc
10 changed files with 487 additions and 142 deletions

View File

@ -20,6 +20,7 @@ Description
#include "argList.H" #include "argList.H"
#include "labelPair.H" #include "labelPair.H"
#include "IntRange.H" #include "IntRange.H"
#include "StringStream.H"
using namespace Foam; using namespace Foam;
@ -66,12 +67,22 @@ int main(int argc, char *argv[])
typedef IntRange<int> intRange; typedef IntRange<int> intRange;
Info<< "Default construct int(32): " << IntRange<int32_t>() << nl Info<< "Default construct int32_t: " << IntRange<int32_t>() << nl
<< "Default construct int(64): " << IntRange<int64_t>() << nl; << "Default construct int64_t: " << IntRange<int64_t>() << nl;
Info<< " one: " << intRange(10) << nl Info<< " one: " << intRange(10) << nl
<< " two: " << intRange(5, 10) << nl; << " two: " << intRange(5, 10) << nl;
// Read from stream
{
IStringStream is("(10 100)");
intRange range;
is >> range;
Info<< "From stream int32_t: " << range << nl;
}
for for
( (
const labelPair& pr const labelPair& pr

View File

@ -70,6 +70,11 @@ int main(int argc, char *argv[])
labelRange::debug = 1; labelRange::debug = 1;
} }
{
labelRange range(5, 10);
Info<< "identity: " << identity(range) << nl;
}
{ {
Info<<"test sorting" << endl; Info<<"test sorting" << endl;
DynamicList<labelRange> list1(10); DynamicList<labelRange> list1(10);

View File

@ -94,6 +94,42 @@ void printInfo(const sliceCoeffs& coeffs)
} }
void printForLoop(const sliceRange& range)
{
Info<< "for " << range << nl
<< " >";
for (const label val : range)
{
Info<< ' ' << val;
}
Info<< nl;
}
template<class IteratorType>
void printIteratorTest(IteratorType& iter)
{
const auto iter2 = (iter - 5);
const auto iter3 = (iter + 5);
// Info<< typeid(iter).name() << nl;
Info<< "begin: " << *iter++;
Info<< " next: " << *iter;
Info<< " next: " << *(++iter);
Info<< " [5]: " << iter[5];
Info<< " +10: " << *(iter + 10);
Info<< " -10: " << *(iter - 10);
Info<< nl;
Info<< "compare: " << *iter2 << " and " << *iter3 << nl;
Info<< " == " << (iter2 == iter3) << nl;
Info<< " < " << (iter2 < iter3) << nl;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
// Main program: // Main program:
@ -119,12 +155,25 @@ int main(int argc, char *argv[])
printInfo(coeffs); printInfo(coeffs);
} }
// Some iterator tests
{
const sliceRange range(25, 8, 3);
auto iter1 = range.begin();
Info<< nl << "Forward iterator for " << range << nl;
printIteratorTest(iter1);
auto iter2 = range.rbegin();
Info<< nl << "Reverse iterator for " << range << nl;
printIteratorTest(iter2);
}
// Generator // Generator
{ {
sliceRange range(25, 8, 3); sliceRange range(25, 8, 3);
Info<< "Generator for " << range << nl; Info<< nl << "Generator for " << range << nl;
auto gen = range.generator(); auto gen = range.generator();
@ -216,6 +265,16 @@ int main(int argc, char *argv[])
<< " = " << flatOutput(list1) << nl; << " = " << flatOutput(list1) << nl;
} }
// For loops
{
Info<< nl << "Test for loops" << nl;
printForLoop(sliceRange(25, 8, -2));
printForLoop(sliceRange(10, 3, 0));
printForLoop(sliceRange(10, 3, 2));
}
Info<< "\nEnd\n" << endl; Info<< "\nEnd\n" << endl;
return 0; return 0;

View File

@ -6,7 +6,7 @@
\\/ M anipulation | \\/ M anipulation |
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
Copyright (C) 2011-2017 OpenFOAM Foundation Copyright (C) 2011-2017 OpenFOAM Foundation
Copyright (C) 2018 OpenCFD Ltd. Copyright (C) 2018-2020 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -49,7 +49,7 @@ Foam::timeSelector::timeSelector(const std::string& str)
bool Foam::timeSelector::selected(const instant& value) const bool Foam::timeSelector::selected(const instant& value) const
{ {
return scalarRanges::operator()(value.value()); return scalarRanges::match(value.value());
} }

View File

@ -42,7 +42,7 @@ SourceFiles
#ifndef IntRange_H #ifndef IntRange_H
#define IntRange_H #define IntRange_H
#include <cstdint> #include "labelFwd.H"
#include <iterator> #include <iterator>
#include <type_traits> #include <type_traits>
@ -52,7 +52,9 @@ namespace Foam
{ {
// Forward Declarations // Forward Declarations
class Istream;
class Ostream; class Ostream;
template<class T> class List;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
Class IntRange Declaration Class IntRange Declaration
@ -71,6 +73,7 @@ class IntRange
//- The length of the interval //- The length of the interval
IntType size_; IntType size_;
protected: protected:
// Protected Member Functions // Protected Member Functions
@ -200,6 +203,42 @@ public:
explicit operator bool() const noexcept { return bool(size_); } explicit operator bool() const noexcept { return bool(size_); }
// Bidirectional input iterators (const)
//- Return const_iterator to a position within the range,
//- with bounds checking.
// \return iterator at the requested position, or end() for
// out-of-bounds
inline const_iterator at(const IntType i) const;
//- A const_iterator set to the beginning of the range
inline const_iterator begin() const;
//- A const_iterator set to the beginning of the range
inline const_iterator cbegin() const;
//- A const_iterator set to 1 beyond the end of the range.
inline const_iterator cend() const;
//- A const_iterator set to 1 beyond the end of the range.
inline const_iterator end() const;
// Bidirectional reverse input iterators (const)
//- A const_reverse_iterator set to 1 before the end of range
inline const_reverse_iterator rbegin() const;
//- A const_reverse_iterator set to 1 before the end of range
inline const_reverse_iterator crbegin() const;
//- A const_reverse_iterator set to 1 before the begin of range
inline const_reverse_iterator rend() const;
//- A const_reverse_iterator set to 1 before the begin of range
inline const_reverse_iterator crend() const;
// Iterators // Iterators
//- Random-access input iterator with const access //- Random-access input iterator with const access
@ -422,50 +461,39 @@ public:
return !(*this < iter); return !(*this < iter);
} }
}; };
// Bidirectional input iterators (const)
//- Return const_iterator to a position within the range,
//- with bounds checking.
// \return iterator at the requested position, or end() for
// out-of-bounds
inline const_iterator at(const IntType i) const;
//- A const_iterator set to the beginning of the range
inline const_iterator begin() const;
//- A const_iterator set to the beginning of the range
inline const_iterator cbegin() const;
//- A const_iterator set to 1 beyond the end of the range.
inline const_iterator cend() const;
//- A const_iterator set to 1 beyond the end of the range.
inline const_iterator end() const;
// Bidirectional reverse input iterators (const)
//- A const_reverse_iterator set to 1 before the end of range
inline const_reverse_iterator rbegin() const;
//- A const_reverse_iterator set to 1 before the end of range
inline const_reverse_iterator crbegin() const;
//- A const_reverse_iterator set to 1 before the begin of range
inline const_reverse_iterator rend() const;
//- A const_reverse_iterator set to 1 before the begin of range
inline const_reverse_iterator crend() const;
}; };
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
// Identity function for common integer types
//- Identity map from an int32_t IntRange
List<label> identity(const IntRange<int32_t>& range);
#if defined(WM_LABEL_SIZE) && (WM_LABEL_SIZE >= 64)
//- Identity map from an int64_t IntRange
List<label> identity(const IntRange<int64_t>& range);
#endif
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
// Input operators for common integer types
//- Read IntRange from Istream as bracketed (start size) tuple, no checks
Istream& operator>>(Istream& os, IntRange<int32_t>& range);
//- Read IntRange from Istream as bracketed (start size) tuple, no checks
Istream& operator>>(Istream& os, IntRange<int64_t>& range);
// Output operators for common integer types // Output operators for common integer types
//- Write IntRange to Ostream as bracketed (start size) tuple
Ostream& operator<<(Ostream& os, const IntRange<int32_t>& range); Ostream& operator<<(Ostream& os, const IntRange<int32_t>& range);
//- Write IntRange to Ostream as bracketed (start size) tuple
Ostream& operator<<(Ostream& os, const IntRange<int64_t>& range); Ostream& operator<<(Ostream& os, const IntRange<int64_t>& range);

View File

@ -25,15 +25,32 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "label.H"
#include "token.H" #include "token.H"
#include "List.H"
#include "Istream.H"
#include "Ostream.H" #include "Ostream.H"
#include <numeric>
// * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
namespace Foam namespace Foam
{ {
#if 0
template<class T>
inline static List<label> makeIdentity(const IntRange<T>& range)
{
if (range.size() < 0)
{
// Skip this check?
return List<label>();
}
List<label> result(range.size());
std::iota(result.begin(), result.end(), range.start());
return result;
}
template<class T> template<class T>
inline static Istream& input(Istream& is, IntRange<T>& range) inline static Istream& input(Istream& is, IntRange<T>& range)
{ {
@ -44,7 +61,6 @@ namespace Foam
is.check(FUNCTION_NAME); is.check(FUNCTION_NAME);
return is; return is;
} }
#endif
template<class T> template<class T>
inline static Ostream& output(Ostream& os, const IntRange<T>& range) inline static Ostream& output(Ostream& os, const IntRange<T>& range)
@ -56,12 +72,28 @@ namespace Foam
os.check(FUNCTION_NAME); os.check(FUNCTION_NAME);
return os; return os;
} }
} // End namespace Foam
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
Foam::List<Foam::label> Foam::identity(const IntRange<int32_t>& range)
{
return makeIdentity(range);
} }
#if defined(WM_LABEL_SIZE) && (WM_LABEL_SIZE >= 64)
Foam::List<Foam::label> Foam::identity(const IntRange<int64_t>& range)
{
return makeIdentity(range);
}
#endif
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * // // * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
#if 0
Foam::Istream& Foam::operator>>(Istream& is, IntRange<int32_t>& range) Foam::Istream& Foam::operator>>(Istream& is, IntRange<int32_t>& range)
{ {
return input(is, range); return input(is, range);
@ -72,7 +104,6 @@ Foam::Istream& Foam::operator>>(Istream& is, IntRange<int64_t>& range)
{ {
return input(is, range); return input(is, range);
} }
#endif
Foam::Ostream& Foam::operator<<(Ostream& os, const IntRange<int32_t>& range) Foam::Ostream& Foam::operator<<(Ostream& os, const IntRange<int32_t>& range)

View File

@ -27,9 +27,8 @@ License
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#include "labelRange.H" #include "labelRange.H"
#include "MinMax.H"
#include "List.H" #include "List.H"
#include "token.H" #include "MinMax.H"
#include <numeric> #include <numeric>
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * // // * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
@ -66,8 +65,9 @@ Foam::labelRange::labelRange(Istream& is)
Foam::List<Foam::label> Foam::labelRange::labels() const Foam::List<Foam::label> Foam::labelRange::labels() const
{ {
if (size() <= 0) if (size() < 0)
{ {
// Skip this check?
return List<label>(); return List<label>();
} }
@ -196,28 +196,4 @@ Foam::labelRange Foam::labelRange::subset0(const label size) const
} }
// * * * * * * * * * * * * * * * IOstream Operators * * * * * * * * * * * * //
Foam::Istream& Foam::operator>>(Istream& is, labelRange& range)
{
is.readBegin("labelRange");
is >> range.start() >> range.size();
is.readEnd("labelRange");
is.check(FUNCTION_NAME);
return is;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const labelRange& range)
{
os << token::BEGIN_LIST
<< range.start() << token::SPACE << range.size()
<< token::END_LIST;
os.check(FUNCTION_NAME);
return os;
}
// ************************************************************************* // // ************************************************************************* //

View File

@ -35,10 +35,10 @@ SourceFiles
labelRangeI.H labelRangeI.H
\*---------------------------------------------------------------------------*/ \*---------------------------------------------------------------------------*/
#ifndef labelRange_H #ifndef labelRange_H
#define labelRange_H #define labelRange_H
#include "label.H"
#include "IntRange.H" #include "IntRange.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -47,9 +47,6 @@ namespace Foam
{ {
// Forward Declarations // Forward Declarations
class Istream;
class Ostream;
template<class T> class List;
template<class T> class MinMax; template<class T> class MinMax;
/*---------------------------------------------------------------------------*\ /*---------------------------------------------------------------------------*\
@ -151,7 +148,8 @@ public:
// Other // Other
//- Return list of labels corresponding to the range //- Return list of labels corresponding to the range.
// Same as Foam::identity()
List<label> labels() const; List<label> labels() const;
//- Return true if the ranges overlap. //- Return true if the ranges overlap.
@ -187,7 +185,7 @@ public:
}; };
// Global Functions // * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
//- Conversion/extraction to labelRange operation (functor). //- Conversion/extraction to labelRange operation (functor).
// Specializations shall provide a corresponding \c operator(). // Specializations shall provide a corresponding \c operator().
@ -205,15 +203,6 @@ public:
template<class> struct labelRangeOp; template<class> struct labelRangeOp;
// IOstream Operators
//- Read labelRange from Istream as (start size) tuple, no checks
Istream& operator>>(Istream& is, labelRange& range);
//- Write labelRange to Ostream as (start size) tuple
Ostream& operator<<(Ostream& os, const labelRange& range);
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
} // End namespace Foam } // End namespace Foam

View File

@ -58,9 +58,7 @@ template<class T, unsigned N> class FixedList;
class sliceRange class sliceRange
{ {
protected: // Private Data
// Protected Data
//- The start of the interval //- The start of the interval
label start_; label start_;
@ -177,15 +175,13 @@ public:
//- Return const_iterator to a position within the range, //- Return const_iterator to a position within the range,
//- with bounds checking. //- with bounds checking.
// \return iterator at the requested position, or end() for // \return iterator at the requested position, or end() for
// out of bounds // out-of-bounds
inline const_iterator at(const label i) const; inline const_iterator at(const label i) const;
//- A const_iterator set to the beginning of the range //- A const_iterator set to the beginning of the range
// The value returned is guaranteed to be the same as start()
inline const_iterator begin() const; inline const_iterator begin() const;
//- A const_iterator set to the beginning of the range //- A const_iterator set to the beginning of the range
// The value returned is guaranteed to be the same as start()
inline const_iterator cbegin() const; inline const_iterator cbegin() const;
//- A const_iterator set to 1 beyond the end of the range. //- A const_iterator set to 1 beyond the end of the range.
@ -232,7 +228,7 @@ public:
//- Default construct with zero value and stride = 1 //- Default construct with zero value and stride = 1
inline constexpr indexer() noexcept; inline constexpr indexer() noexcept;
//- Construct with specified value and stride, //- Construct with specified value and stride
inline constexpr indexer inline constexpr indexer
( (
const label val, const label val,
@ -242,6 +238,18 @@ public:
// Member Functions // Member Functions
//- The current value
constexpr label value() const noexcept { return value_; }
//- The stride
constexpr label stride() const noexcept { return stride_; }
//- Value with offset
constexpr label value(const label n) const noexcept
{
return value_ + (n * stride_);
}
//- Decrement value //- Decrement value
void prev() noexcept { value_ -= stride_; } void prev() noexcept { value_ -= stride_; }
@ -254,12 +262,6 @@ public:
//- Increase value //- Increase value
void next(const label n) noexcept { value_ += (n * stride_); } void next(const label n) noexcept { value_ += (n * stride_); }
//- Test for equality of values, ignore stride
constexpr bool equals(const indexer& other) const noexcept
{
return (value_ == other.value_);
}
// Member Operators // Member Operators
@ -269,7 +271,7 @@ public:
//- Apply a postfix increment and return the current value. //- Apply a postfix increment and return the current value.
// This operator definition is required for a generator - // This operator definition is required for a generator -
// see std::generate() // see std::generate()
inline label operator()(); inline label operator()() noexcept;
}; };
@ -281,7 +283,7 @@ public:
public: public:
// STL definitions (as per std::iterator) // STL definitions (as per std::iterator)
typedef std::bidirectional_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
// Constructors // Constructors
@ -292,28 +294,81 @@ public:
// Member Operators // Member Operators
//- Offset dereference operator
inline constexpr label operator[](const label n) const noexcept;
//- Prefix increment //- Prefix increment
inline const_iterator& operator++() noexcept; inline const_iterator& operator++() noexcept;
//- Arbitrary increment //- Postfix increment
inline const_iterator& operator+=(const label n) noexcept; inline const_iterator operator++(int) noexcept;
//- Prefix decrement //- Prefix decrement
inline const_iterator& operator--() noexcept; inline const_iterator& operator--() noexcept;
//- Postfix decrement
inline const_iterator operator--(int) noexcept;
//- Arbitrary increment
inline const_iterator& operator+=(const label n) noexcept;
//- Arbitrary decrement //- Arbitrary decrement
inline const_iterator& operator-=(const label n) noexcept; inline const_iterator& operator-=(const label n) noexcept;
//- Test for equality of values, ignore stride //- Return iterator with offset
constexpr bool operator==(const const_iterator& iter) const noexcept inline constexpr const_iterator operator+
(
const label n
) const noexcept;
//- Return iterator with offset
inline constexpr const_iterator operator-
(
const label n
) const noexcept;
//- Difference operator
inline constexpr label operator-
(
const const_iterator& iter
) const noexcept;
// Comparison
//- Test for equality of values (ignore stride)
inline constexpr bool operator==(const const_iterator& iter)
const noexcept;
//- Compare less-than values (ignore stride)
inline constexpr bool operator<(const const_iterator& iter)
const noexcept;
// Derived comparisons
constexpr bool operator!=(const const_iterator& iter)
const noexcept
{ {
return equals(iter); return !(*this == iter);
} }
//- Test for inequality of values, ignore stride constexpr bool operator<=(const const_iterator& iter)
constexpr bool operator!=(const const_iterator& iter) const noexcept const noexcept
{ {
return !equals(iter); return !(iter < *this);
}
constexpr bool operator>(const const_iterator& iter)
const noexcept
{
return (iter < *this);
}
constexpr bool operator>=(const const_iterator& iter)
const noexcept
{
return !(*this < iter);
} }
}; };
@ -326,7 +381,7 @@ public:
public: public:
// STL definitions (as per std::iterator) // STL definitions (as per std::iterator)
typedef std::bidirectional_iterator_tag iterator_category; typedef std::random_access_iterator_tag iterator_category;
// Constructors // Constructors
@ -337,30 +392,81 @@ public:
// Member Operators // Member Operators
//- Offset dereference operator
inline constexpr label operator[](const label n) const noexcept;
//- Prefix increment //- Prefix increment
inline const_reverse_iterator& operator++() noexcept; inline const_reverse_iterator& operator++() noexcept;
//- Arbitrary increment //- Postfix increment
inline const_reverse_iterator& operator+=(const label n) noexcept; inline const_reverse_iterator operator++(int) noexcept;
//- Prefix decrement //- Prefix decrement
inline const_reverse_iterator& operator--() noexcept; inline const_reverse_iterator& operator--() noexcept;
//- Postfix decrement
inline const_reverse_iterator operator--(int) noexcept;
//- Arbitrary increment
inline const_reverse_iterator& operator+=(const label n) noexcept;
//- Arbitrary decrement //- Arbitrary decrement
inline const_reverse_iterator& operator-=(const label n) noexcept; inline const_reverse_iterator& operator-=(const label n) noexcept;
//- Test for equality of values (not stride) //- Return iterator with offset
constexpr bool operator==(const const_reverse_iterator& iter) inline constexpr const_reverse_iterator operator+
const noexcept (
{ const label n
return equals(iter); ) const noexcept;
}
//- Return iterator with offset
inline constexpr const_reverse_iterator operator-
(
const label n
) const noexcept;
//- Difference operator
inline constexpr label operator-
(
const const_reverse_iterator& iter
) const noexcept;
// Comparison
//- Test for equality of values (ignore stride)
inline constexpr bool operator==(const const_reverse_iterator& iter)
const noexcept;
//- Reverse compare less-than values (ignore stride)
inline constexpr bool operator<(const const_reverse_iterator& iter)
const noexcept;
// Derived comparisons
//- Test for inequality of values (not stride)
constexpr bool operator!=(const const_reverse_iterator& iter) constexpr bool operator!=(const const_reverse_iterator& iter)
const noexcept const noexcept
{ {
return !equals(iter); return !(*this == iter);
}
constexpr bool operator<=(const const_reverse_iterator& iter)
const noexcept
{
return !(iter < *this);
}
constexpr bool operator>(const const_reverse_iterator& iter)
const noexcept
{
return (iter < *this);
}
constexpr bool operator>=(const const_reverse_iterator& iter)
const noexcept
{
return !(*this < iter);
} }
}; };
}; };

View File

@ -72,7 +72,7 @@ inline constexpr Foam::sliceRange::indexer::indexer
inline Foam::label inline Foam::label
Foam::sliceRange::indexer:: Foam::sliceRange::indexer::
operator()() operator()() noexcept
{ {
const label old(value_); const label old(value_);
next(); next();
@ -80,6 +80,16 @@ operator()()
} }
// * * * * * * * * * * * * * * Forward Iterators * * * * * * * * * * * * * * //
inline constexpr Foam::label
Foam::sliceRange::const_iterator::
operator[](const label n) const noexcept
{
return value(n);
}
inline Foam::sliceRange::const_iterator& inline Foam::sliceRange::const_iterator&
Foam::sliceRange::const_iterator:: Foam::sliceRange::const_iterator::
operator++() noexcept operator++() noexcept
@ -89,6 +99,35 @@ operator++() noexcept
} }
inline Foam::sliceRange::const_iterator
Foam::sliceRange::const_iterator::
operator++(int) noexcept
{
const_iterator old(*this);
next();
return old;
}
inline Foam::sliceRange::const_iterator&
Foam::sliceRange::const_iterator::
operator--() noexcept
{
prev();
return *this;
}
inline Foam::sliceRange::const_iterator
Foam::sliceRange::const_iterator::
operator--(int) noexcept
{
const_iterator old(*this);
prev();
return old;
}
inline Foam::sliceRange::const_iterator& inline Foam::sliceRange::const_iterator&
Foam::sliceRange::const_iterator:: Foam::sliceRange::const_iterator::
operator+=(const label n) noexcept operator+=(const label n) noexcept
@ -98,15 +137,6 @@ operator+=(const label n) noexcept
} }
inline Foam::sliceRange::const_iterator&
Foam::sliceRange::const_iterator::
operator--() noexcept
{
prev();
return *this;
}
inline Foam::sliceRange::const_iterator& inline Foam::sliceRange::const_iterator&
Foam::sliceRange::const_iterator:: Foam::sliceRange::const_iterator::
operator-=(const label n) noexcept operator-=(const label n) noexcept
@ -116,6 +146,56 @@ operator-=(const label n) noexcept
} }
inline constexpr Foam::sliceRange::const_iterator
Foam::sliceRange::const_iterator::
operator+(const label n) const noexcept
{
return const_iterator(value(n), stride());
}
inline constexpr Foam::sliceRange::const_iterator
Foam::sliceRange::const_iterator::
operator-(const label n) const noexcept
{
return const_iterator(value(-n), stride());
}
inline constexpr Foam::label
Foam::sliceRange::const_iterator::
operator-(const const_iterator& iter) const noexcept
{
return (stride() ? (value() - iter.value()) / stride() : label{0});
}
inline constexpr bool
Foam::sliceRange::const_iterator::
operator==(const const_iterator& iter) const noexcept
{
return (value() == iter.value());
}
inline constexpr bool
Foam::sliceRange::const_iterator::
operator<(const const_iterator& iter) const noexcept
{
return (value() < iter.value());
}
// * * * * * * * * * * * * * * Reverse Iterators * * * * * * * * * * * * * * //
inline constexpr Foam::label
Foam::sliceRange::const_reverse_iterator::
operator[](const label n) const noexcept
{
return value(-n);
}
inline Foam::sliceRange::const_reverse_iterator& inline Foam::sliceRange::const_reverse_iterator&
Foam::sliceRange::const_reverse_iterator:: Foam::sliceRange::const_reverse_iterator::
operator++() noexcept operator++() noexcept
@ -125,6 +205,35 @@ operator++() noexcept
} }
inline Foam::sliceRange::const_reverse_iterator
Foam::sliceRange::const_reverse_iterator::
operator++(int) noexcept
{
const_reverse_iterator old(*this);
prev();
return old;
}
inline Foam::sliceRange::const_reverse_iterator&
Foam::sliceRange::const_reverse_iterator::
operator--() noexcept
{
next();
return *this;
}
inline Foam::sliceRange::const_reverse_iterator
Foam::sliceRange::const_reverse_iterator::
operator--(int) noexcept
{
const_reverse_iterator old(*this);
next();
return old;
}
inline Foam::sliceRange::const_reverse_iterator& inline Foam::sliceRange::const_reverse_iterator&
Foam::sliceRange::const_reverse_iterator:: Foam::sliceRange::const_reverse_iterator::
operator+=(const label n) noexcept operator+=(const label n) noexcept
@ -134,15 +243,6 @@ operator+=(const label n) noexcept
} }
inline Foam::sliceRange::const_reverse_iterator&
Foam::sliceRange::const_reverse_iterator::
operator--() noexcept
{
next();
return *this;
}
inline Foam::sliceRange::const_reverse_iterator& inline Foam::sliceRange::const_reverse_iterator&
Foam::sliceRange::const_reverse_iterator:: Foam::sliceRange::const_reverse_iterator::
operator-=(const label n) noexcept operator-=(const label n) noexcept
@ -152,6 +252,46 @@ operator-=(const label n) noexcept
} }
inline constexpr Foam::sliceRange::const_reverse_iterator
Foam::sliceRange::const_reverse_iterator::
operator+(const label n) const noexcept
{
return const_reverse_iterator(value(-n), stride());
}
inline constexpr Foam::sliceRange::const_reverse_iterator
Foam::sliceRange::const_reverse_iterator::
operator-(const label n) const noexcept
{
return const_reverse_iterator(value(n), stride());
}
inline constexpr Foam::label
Foam::sliceRange::const_reverse_iterator::
operator-(const const_reverse_iterator& iter) const noexcept
{
return (stride() ? (iter.value() - value()) / stride() : label{0});
}
inline constexpr bool
Foam::sliceRange::const_reverse_iterator::
operator==(const const_reverse_iterator& iter) const noexcept
{
return (value() == iter.value());
}
inline constexpr bool
Foam::sliceRange::const_reverse_iterator::
operator<(const const_reverse_iterator& iter) const noexcept
{
return (iter.value() < value());
}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
inline Foam::sliceRange::indexer inline Foam::sliceRange::indexer