mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
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:
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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);
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user