mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: improved swap/transfer methods for FixedList
- the transfer method was previously a copy - use std::reverse_iterator adaptors in FixedList This greatly reduces the amount of code and now avoids the array-bounds warning for FixedList::rend() - use pointer arithmetic instead of dereferencing the internal array
This commit is contained in:
@ -25,7 +25,7 @@ Application
|
||||
Test-FixedList
|
||||
|
||||
Description
|
||||
Simple tests and examples of use of FixedList
|
||||
Simple tests and examples for FixedList
|
||||
|
||||
See also
|
||||
Foam::FixedList
|
||||
@ -42,47 +42,72 @@ See also
|
||||
|
||||
using namespace Foam;
|
||||
|
||||
template<class T, unsigned Size>
|
||||
Ostream& printInfo(const FixedList<List<T>, Size>& list)
|
||||
{
|
||||
Info<< list << " addresses:";
|
||||
for (unsigned i = 0; i < Size; ++i)
|
||||
{
|
||||
Info<< " " << long(list[i].cdata());
|
||||
}
|
||||
Info<< nl;
|
||||
return Info;
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
Ostream& printInfo
|
||||
(
|
||||
const FixedList<List<T>, Size>& list1,
|
||||
const FixedList<List<T>, Size>& list2
|
||||
)
|
||||
{
|
||||
Info<< "llist1:"; printInfo(list1);
|
||||
Info<< "llist2:"; printInfo(list2);
|
||||
return Info;
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// Main program:
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
argList args(argc, argv);
|
||||
argList::addBoolOption("assign");
|
||||
argList::addBoolOption("iter");
|
||||
argList::addBoolOption("swap");
|
||||
argList::addBoolOption("default", "reinstate default tests");
|
||||
argList::addNote("runs default tests or specified ones only");
|
||||
|
||||
if (false)
|
||||
#include "setRootCase.H"
|
||||
|
||||
// Run default tests, unless only specific tests are requested
|
||||
const bool defaultTests =
|
||||
args.found("default") || args.options().empty();
|
||||
|
||||
|
||||
if (defaultTests || args.found("iter"))
|
||||
{
|
||||
FixedList<string, 1> ident;
|
||||
Info<< nl
|
||||
<< "Test iterators" << nl;
|
||||
|
||||
auto iter = ident.begin();
|
||||
|
||||
Info << iter->size() << endl;
|
||||
|
||||
auto riter = ident.rbegin();
|
||||
Info << riter->size() << endl;
|
||||
|
||||
auto iter2 = ident.rbegin();
|
||||
|
||||
iter2 = iter;
|
||||
}
|
||||
|
||||
{
|
||||
FixedList<label, 15> ident;
|
||||
std::iota(ident.begin(), ident.end(), 0);
|
||||
|
||||
// auto iter = ident.begin();
|
||||
//
|
||||
// iter += 5;
|
||||
// Info << *iter << "< " << endl;
|
||||
// Info << *iter << "< " << nl;
|
||||
// iter -= 2;
|
||||
// Info << *iter << "< " << endl;
|
||||
// Info << *iter << "< " << nl;
|
||||
|
||||
// Don't yet bother with making reverse iterators random access
|
||||
// auto riter = ident.crbegin();
|
||||
|
||||
// riter += 5;
|
||||
// Info << *riter << "< " << endl;
|
||||
// Info << *riter << "< " << nl;
|
||||
// riter += 2;
|
||||
// Info << *riter << "< " << endl;
|
||||
// Info << *riter << "< " << nl;
|
||||
|
||||
Info<<"Ident:";
|
||||
forAllConstIters(ident, iter)
|
||||
@ -106,65 +131,121 @@ int main(int argc, char *argv[])
|
||||
Info<< nl;
|
||||
}
|
||||
|
||||
if (defaultTests || args.found("swap"))
|
||||
{
|
||||
FixedList<label, 4> list1{1, 2, 3, 4};
|
||||
Info<< nl
|
||||
<< "Test swap" << nl;
|
||||
|
||||
FixedList<label, 4> list1{2, 3, 4, 5};
|
||||
|
||||
Info<< "list1:" << list1
|
||||
<< " hash:" << FixedList<label, 4>::Hash<>()(list1) << endl;
|
||||
<< " hash:" << FixedList<label, 4>::Hash<>()(list1) << nl;
|
||||
|
||||
label a[4] = {0, 1, 2, 3};
|
||||
FixedList<label, 4> list2(a);
|
||||
|
||||
Info<< "list2:" << list2
|
||||
<< " hash:" << FixedList<label, 4>::Hash<>()(list2) << endl;
|
||||
<< " hash:" << FixedList<label, 4>::Hash<>()(list2) << nl;
|
||||
|
||||
// Using FixedList for content too
|
||||
{
|
||||
List<FixedList<label, 4>> twolists{list1, list2};
|
||||
Info<<"List of FixedList: " << flatOutput(twolists) << endl;
|
||||
Info<<"List of FixedList: " << flatOutput(twolists) << nl;
|
||||
sort(twolists);
|
||||
// outer-sort only
|
||||
Info<<"sorted FixedList : " << flatOutput(twolists) << endl;
|
||||
Info<<"sorted FixedList : " << flatOutput(twolists) << nl;
|
||||
}
|
||||
|
||||
Info<< "====" << nl
|
||||
<< "Test swap" << nl;
|
||||
|
||||
Info<< "list1: " << list1 << nl
|
||||
<< "list2: " << list2 << endl;
|
||||
<< "list2: " << list2 << nl;
|
||||
|
||||
// Addresses don't change with swap
|
||||
Info<< "mem: " << long(list1.data()) << " " << long(list2.data()) << nl;
|
||||
|
||||
list1.swap(list2);
|
||||
Info<< "The swap() method" << endl;
|
||||
Info<< "The swap() method" << nl;
|
||||
Info<< "list1: " << list1 << nl
|
||||
<< "list2: " << list2 << endl;
|
||||
<< "list2: " << list2 << nl;
|
||||
|
||||
Info<< "mem: " << long(list1.data()) << " " << long(list2.data()) << nl;
|
||||
|
||||
Swap(list1, list2);
|
||||
Info<< "The Swap() function" << endl;
|
||||
Info<< "The Swap() function" << nl;
|
||||
Info<< "list1: " << list1 << nl
|
||||
<< "list2: " << list2 << endl;
|
||||
<< "list2: " << list2 << nl;
|
||||
|
||||
Info<< "mem: " << long(list1.data()) << " " << long(list2.data()) << nl;
|
||||
|
||||
Info<< "====" << nl;
|
||||
|
||||
|
||||
Info<< nl
|
||||
<< "Test of swap with other container content" << nl;
|
||||
|
||||
FixedList<labelList, 4> llist1;
|
||||
FixedList<labelList, 4> llist2;
|
||||
|
||||
{
|
||||
label i = 1;
|
||||
for (auto& item : llist1)
|
||||
{
|
||||
item = identity(1 + 1.5*i);
|
||||
++i;
|
||||
}
|
||||
}
|
||||
|
||||
Info<< nl
|
||||
<< "initial lists" << nl;
|
||||
printInfo(llist1, llist2);
|
||||
|
||||
llist2.transfer(llist1);
|
||||
Info<< nl
|
||||
<< "After transfer" << nl;
|
||||
printInfo(llist1, llist2);
|
||||
|
||||
llist2.swap(llist1);
|
||||
Info<< nl
|
||||
<< "After swap" << nl;
|
||||
printInfo(llist1, llist2);
|
||||
|
||||
llist2 = llist1;
|
||||
Info<< nl
|
||||
<< "After copy assignment" << nl;
|
||||
printInfo(llist1, llist2);
|
||||
|
||||
llist2 = std::move(llist1);
|
||||
Info<< nl
|
||||
<< "After move assignment" << nl;
|
||||
printInfo(llist1, llist2);
|
||||
}
|
||||
|
||||
Info<< nl
|
||||
<< "Test construct and assignment" << nl;
|
||||
|
||||
|
||||
List<label> list3{0, 1, 2, 3};
|
||||
FixedList<label, 4> list4(list3.begin(), list3.end());
|
||||
Info<< "list3: " << list3 << nl
|
||||
<< "list4: " << list4 << endl;
|
||||
<< "list4: " << list4 << nl;
|
||||
|
||||
list4 = {1, 2, 3, 5};
|
||||
Info<< "list4: " << list4 << nl;
|
||||
|
||||
FixedList<label, 5> list5{0, 1, 2, 3, 4};
|
||||
Info<< "list5: " << list5 << endl;
|
||||
Info<< "list5: " << list5 << nl;
|
||||
|
||||
List<FixedList<label, 2>> list6{{0, 1}, {2, 3}};
|
||||
Info<< "list6: " << list6 << endl;
|
||||
Info<< "list6: " << list6 << nl;
|
||||
|
||||
if (Pstream::parRun())
|
||||
{
|
||||
if (Pstream::myProcNo() != Pstream::masterNo())
|
||||
{
|
||||
Serr<< "slave sending to master "
|
||||
<< Pstream::masterNo() << endl;
|
||||
<< Pstream::masterNo() << nl;
|
||||
|
||||
OPstream toMaster
|
||||
(
|
||||
|
||||
@ -52,13 +52,6 @@ Foam::label Foam::FixedList<T, Size>::find
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
void Foam::FixedList<T, Size>::swap(FixedList<T, Size>& lst)
|
||||
{
|
||||
Foam::Swap(v_, lst.v_);
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
void Foam::FixedList<T, Size>::moveFirst(const label i)
|
||||
{
|
||||
@ -112,72 +105,74 @@ void Foam::FixedList<T, Size>::swapLast(const label i)
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator==(const FixedList<T, Size>& a) const
|
||||
bool Foam::FixedList<T, Size>::operator==(const FixedList<T, Size>& list) const
|
||||
{
|
||||
bool equal = true;
|
||||
|
||||
List_CONST_ACCESS(T, (*this), vp);
|
||||
List_CONST_ACCESS(T, (a), ap);
|
||||
List_CONST_ACCESS(T, *this, lhs);
|
||||
List_CONST_ACCESS(T, (list), rhs);
|
||||
|
||||
// List sizes are identical by definition (template parameter)
|
||||
for (unsigned i = 0; i < Size; ++i)
|
||||
{
|
||||
equal = (vp[i] == ap[i]);
|
||||
if (!equal) break;
|
||||
}
|
||||
|
||||
return equal;
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator!=(const FixedList<T, Size>& a) const
|
||||
{
|
||||
return !operator==(a);
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator<(const FixedList<T, Size>& a) const
|
||||
{
|
||||
List_CONST_ACCESS(T, *this, ptr1);
|
||||
List_CONST_ACCESS(T, a, ptr2);
|
||||
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
if (ptr1[i] < ptr2[i])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (ptr1[i] > ptr2[i])
|
||||
if (!(lhs[i] == rhs[i]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Contents look to be identical.
|
||||
// The sizes are identical by definition (template parameter)
|
||||
// Contents appear to be identical.
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator<(const FixedList<T, Size>& list) const
|
||||
{
|
||||
List_CONST_ACCESS(T, *this, lhs);
|
||||
List_CONST_ACCESS(T, (list), rhs);
|
||||
|
||||
// List sizes are identical by definition (template parameter)
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
if (lhs[i] < rhs[i])
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else if (rhs[i] < lhs[i])
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// Contents appear to be identical.
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator>(const FixedList<T, Size>& a) const
|
||||
bool Foam::FixedList<T, Size>::operator!=(const FixedList<T, Size>& list) const
|
||||
{
|
||||
return a.operator<(*this);
|
||||
return !operator==(list);
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator<=(const FixedList<T, Size>& a) const
|
||||
bool Foam::FixedList<T, Size>::operator>(const FixedList<T, Size>& list) const
|
||||
{
|
||||
return !operator>(a);
|
||||
return list.operator<(*this);
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator>=(const FixedList<T, Size>& a) const
|
||||
bool Foam::FixedList<T, Size>::operator<=(const FixedList<T, Size>& list) const
|
||||
{
|
||||
return !operator<(a);
|
||||
return !list.operator<(*this);
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
bool Foam::FixedList<T, Size>::operator>=(const FixedList<T, Size>& list) const
|
||||
{
|
||||
return !operator<(list);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -47,6 +47,7 @@ SourceFiles
|
||||
|
||||
#include <type_traits>
|
||||
#include <initializer_list>
|
||||
#include <iterator>
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -95,6 +96,42 @@ protected:
|
||||
|
||||
public:
|
||||
|
||||
// STL type definitions
|
||||
|
||||
//- The value type the FixedList contains
|
||||
typedef T value_type;
|
||||
|
||||
//- The pointer type for non-const access to value_type items
|
||||
typedef T* pointer;
|
||||
|
||||
//- The pointer type for const access to value_type items
|
||||
typedef const T* const_pointer;
|
||||
|
||||
//- The type used for storing into value_type objects
|
||||
typedef T& reference;
|
||||
|
||||
//- The type used for reading from constant value_type objects.
|
||||
typedef const T& const_reference;
|
||||
|
||||
//- Random access iterator for traversing FixedList
|
||||
typedef T* iterator;
|
||||
|
||||
//- Random access iterator for traversing FixedList
|
||||
typedef const T* const_iterator;
|
||||
|
||||
//- The type to represent the size of a FixedList
|
||||
typedef label size_type;
|
||||
|
||||
//- The difference between iterator objects
|
||||
typedef label difference_type;
|
||||
|
||||
//- Reverse iterator (non-const access)
|
||||
typedef std::reverse_iterator<iterator> reverse_iterator;
|
||||
|
||||
//- Reverse iterator (const access)
|
||||
typedef std::reverse_iterator<const_iterator> const_reverse_iterator;
|
||||
|
||||
|
||||
//- Hashing function class.
|
||||
// Use Hasher directly for contiguous data. Otherwise hash incrementally.
|
||||
template<class HashT=Hash<T>>
|
||||
@ -102,7 +139,7 @@ public:
|
||||
{
|
||||
inline unsigned operator()
|
||||
(
|
||||
const FixedList<T, Size>&,
|
||||
const FixedList<T, Size>& lst,
|
||||
unsigned seed = 0
|
||||
) const;
|
||||
};
|
||||
@ -117,7 +154,7 @@ public:
|
||||
// Constructors
|
||||
|
||||
//- Null constructor
|
||||
inline FixedList();
|
||||
inline FixedList() = default;
|
||||
|
||||
//- Construct from value
|
||||
explicit inline FixedList(const T& val);
|
||||
@ -128,7 +165,8 @@ public:
|
||||
//- Copy constructor
|
||||
inline FixedList(const FixedList<T, Size>& lst);
|
||||
|
||||
//- Move constructor
|
||||
//- Move construct by using move assignment for the individual
|
||||
//- list elements
|
||||
inline FixedList(FixedList<T, Size>&& lst);
|
||||
|
||||
//- Construct given begin/end iterators
|
||||
@ -227,11 +265,11 @@ public:
|
||||
|
||||
//- Dummy resize function
|
||||
// needed to make FixedList consistent with List
|
||||
inline void resize(const label s);
|
||||
inline void resize(const label n);
|
||||
|
||||
//- Dummy setSize function
|
||||
// needed to make FixedList consistent with List
|
||||
inline void setSize(const label s);
|
||||
inline void setSize(const label n);
|
||||
|
||||
//- Move element to the first position.
|
||||
void moveFirst(const label i);
|
||||
@ -245,9 +283,9 @@ public:
|
||||
//- Swap element with the last element.
|
||||
void swapLast(const label i);
|
||||
|
||||
//- Copy (not transfer) the argument contents
|
||||
// needed to make FixedList consistent with List
|
||||
void transfer(const FixedList<T, Size>& lst);
|
||||
//- Transfer by swapping using a move assignment for the content
|
||||
//- of the individual list elements
|
||||
inline void transfer(FixedList<T, Size>& lst);
|
||||
|
||||
|
||||
// Member operators
|
||||
@ -280,29 +318,7 @@ public:
|
||||
inline void operator=(FixedList<T, Size>&& lst);
|
||||
|
||||
|
||||
// STL type definitions
|
||||
|
||||
//- Type of values the FixedList contains
|
||||
typedef T value_type;
|
||||
|
||||
//- The type used for storing into value_type objects
|
||||
typedef T& reference;
|
||||
|
||||
//- The type used for reading from constant value_type objects.
|
||||
typedef const T& const_reference;
|
||||
|
||||
//- The type that can represent the difference between any two
|
||||
//- FixedList iterator objects
|
||||
typedef label difference_type;
|
||||
|
||||
//- The type that can represent the size of a FixedList
|
||||
typedef label size_type;
|
||||
|
||||
|
||||
// STL iterator
|
||||
|
||||
//- Random access iterator for traversing FixedList
|
||||
typedef T* iterator;
|
||||
// Random access iterator (non-const)
|
||||
|
||||
//- Return an iterator to begin traversing the FixedList
|
||||
inline iterator begin();
|
||||
@ -311,10 +327,7 @@ public:
|
||||
inline iterator end();
|
||||
|
||||
|
||||
// STL const_iterator
|
||||
|
||||
//- Random access iterator for traversing FixedList
|
||||
typedef const T* const_iterator;
|
||||
// Random access iterator (const)
|
||||
|
||||
//- Return const_iterator to begin traversing the constant FixedList
|
||||
inline const_iterator cbegin() const;
|
||||
@ -329,86 +342,7 @@ public:
|
||||
inline const_iterator end() const;
|
||||
|
||||
|
||||
// Reverse iterators
|
||||
|
||||
//- Generic const/non-const reverse iterator
|
||||
template<bool Const>
|
||||
class reverse_iterator_base
|
||||
{
|
||||
public:
|
||||
//- The const/non-const type for entries
|
||||
typedef typename std::conditional
|
||||
<Const, const T, T>::type value_type;
|
||||
|
||||
//- A pointer to a const/non-const entry
|
||||
typedef value_type* pointer;
|
||||
|
||||
//- A reference to a const/non-const entry
|
||||
typedef value_type& reference;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
//- The element pointer
|
||||
pointer ptr_;
|
||||
|
||||
public:
|
||||
|
||||
//- Construct null or from list element pointer
|
||||
inline reverse_iterator_base(pointer ptr = nullptr)
|
||||
:
|
||||
ptr_(ptr)
|
||||
{}
|
||||
|
||||
//- Copy construct
|
||||
inline reverse_iterator_base(const reverse_iterator_base& iter)
|
||||
:
|
||||
ptr_(iter.ptr_)
|
||||
{}
|
||||
|
||||
|
||||
//- Reverse increment
|
||||
inline void operator++()
|
||||
{
|
||||
--ptr_;
|
||||
}
|
||||
|
||||
//- Reverse increment
|
||||
inline reverse_iterator_base operator++(int)
|
||||
{
|
||||
reverse_iterator_base old(*this);
|
||||
--ptr_;
|
||||
return old;
|
||||
}
|
||||
|
||||
//- Dereference iterator
|
||||
reference operator*() const
|
||||
{
|
||||
return *ptr_;
|
||||
}
|
||||
|
||||
//- Dereference iterator
|
||||
pointer operator->() const
|
||||
{
|
||||
return ptr_;
|
||||
}
|
||||
|
||||
//- Equality
|
||||
bool operator==(const reverse_iterator_base& iter) const
|
||||
{
|
||||
return ptr_ == iter.ptr_;
|
||||
}
|
||||
|
||||
//- inequality
|
||||
bool operator!=(const reverse_iterator_base& iter) const
|
||||
{
|
||||
return ptr_ != iter.ptr_;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//- STL reverse_iterator
|
||||
typedef reverse_iterator_base<false> reverse_iterator;
|
||||
// Reverse iterator (non-const)
|
||||
|
||||
//- Return reverse_iterator to begin reverse traversing the FixedList
|
||||
inline reverse_iterator rbegin();
|
||||
@ -417,8 +351,7 @@ public:
|
||||
inline reverse_iterator rend();
|
||||
|
||||
|
||||
//- STL const reverse iterator
|
||||
typedef reverse_iterator_base<true> const_reverse_iterator;
|
||||
// Reverse iterator (const)
|
||||
|
||||
//- Return const_reverse_iterator to begin reverse traversing FixedList
|
||||
inline const_reverse_iterator crbegin() const;
|
||||
@ -444,31 +377,31 @@ public:
|
||||
//- Always false since zero-sized FixedList is compile-time disabled.
|
||||
inline bool empty() const;
|
||||
|
||||
//- Swap content with another FixedList of the same type.
|
||||
void swap(FixedList<T, Size>& lst);
|
||||
//- Swap lists by swapping the content of the individual list elements
|
||||
inline void swap(FixedList<T, Size>& lst);
|
||||
|
||||
|
||||
// STL member operators
|
||||
|
||||
//- Equality operation on FixedLists of the same type.
|
||||
// Returns true when the FixedLists are element-wise equal
|
||||
// (using FixedList::value_type::operator==). Takes linear time
|
||||
bool operator==(const FixedList<T, Size>& a) const;
|
||||
// (using FixedList::value_type::operator==). Takes linear time
|
||||
bool operator==(const FixedList<T, Size>& list) const;
|
||||
|
||||
//- The opposite of the equality operation. Takes linear time
|
||||
bool operator!=(const FixedList<T, Size>& a) const;
|
||||
bool operator!=(const FixedList<T, Size>& list) const;
|
||||
|
||||
//- Compare two FixedLists lexicographically. Takes linear time
|
||||
bool operator<(const FixedList<T, Size>& a) const;
|
||||
bool operator<(const FixedList<T, Size>& list) const;
|
||||
|
||||
//- Compare two FixedLists lexicographically. Takes linear time
|
||||
bool operator>(const FixedList<T, Size>& a) const;
|
||||
bool operator>(const FixedList<T, Size>& list) const;
|
||||
|
||||
//- Return true if !(a > b). Takes linear time
|
||||
bool operator<=(const FixedList<T, Size>& a) const;
|
||||
bool operator<=(const FixedList<T, Size>& list) const;
|
||||
|
||||
//- Return true if !(a < b). Takes linear time
|
||||
bool operator>=(const FixedList<T, Size>& a) const;
|
||||
bool operator>=(const FixedList<T, Size>& list) const;
|
||||
|
||||
|
||||
// Writing
|
||||
@ -484,14 +417,14 @@ public:
|
||||
|
||||
// IOstream operators
|
||||
|
||||
//- Read List from Istream, discarding contents of existing List
|
||||
//- Read from Istream, discarding contents of existing List
|
||||
friend Istream& operator>> <T, Size>
|
||||
(
|
||||
Istream& is,
|
||||
FixedList<T, Size>& lst
|
||||
);
|
||||
|
||||
//- Write List to Ostream, as per writeList() with shortListLen=10
|
||||
//- Write to Ostream, as per writeList() with shortListLen=10
|
||||
friend Ostream& operator<< <T, Size>
|
||||
(
|
||||
Ostream& os,
|
||||
@ -502,9 +435,10 @@ public:
|
||||
|
||||
// Global Functions
|
||||
|
||||
// Exchange contents of lists - see FixedList::swap().
|
||||
//- Swap FixedList contents - see FixedList::swap().
|
||||
// Internally this actually swaps the individual list elements
|
||||
template<class T, unsigned Size>
|
||||
inline void Swap(FixedList<T,Size>& a, FixedList<T,Size>& b);
|
||||
inline void Swap(FixedList<T,Size>& lhs, FixedList<T,Size>& rhs);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
@ -32,11 +32,6 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline Foam::FixedList<T, Size>::FixedList()
|
||||
{}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline Foam::FixedList<T, Size>::FixedList(const T& val)
|
||||
{
|
||||
@ -62,7 +57,7 @@ inline Foam::FixedList<T, Size>::FixedList(const FixedList<T, Size>& lst)
|
||||
{
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
v_[i] = lst[i];
|
||||
v_[i] = lst.v_[i];
|
||||
}
|
||||
}
|
||||
|
||||
@ -70,9 +65,6 @@ inline Foam::FixedList<T, Size>::FixedList(const FixedList<T, Size>& lst)
|
||||
template<class T, unsigned Size>
|
||||
inline Foam::FixedList<T, Size>::FixedList(FixedList<T, Size>&& lst)
|
||||
{
|
||||
// No significant speedup observed for copy assignment on simple types,
|
||||
// use move assignment for generality with more complex types
|
||||
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
v_[i] = std::move(lst.v_[i]);
|
||||
@ -82,7 +74,7 @@ inline Foam::FixedList<T, Size>::FixedList(FixedList<T, Size>&& lst)
|
||||
|
||||
template<class T, unsigned Size>
|
||||
template<class InputIterator>
|
||||
Foam::FixedList<T, Size>::FixedList
|
||||
inline Foam::FixedList<T, Size>::FixedList
|
||||
(
|
||||
InputIterator begIter,
|
||||
InputIterator endIter
|
||||
@ -130,7 +122,7 @@ inline Foam::FixedList<T, Size>::FixedList(const SLList<T>& lst)
|
||||
{
|
||||
checkSize(lst.size());
|
||||
|
||||
typename SLList<T>::const_iterator iter = lst.begin();
|
||||
auto iter = lst.begin();
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
v_[i] = *iter;
|
||||
@ -246,28 +238,38 @@ inline bool Foam::FixedList<T, Size>::found
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline void Foam::FixedList<T, Size>::resize(const label s)
|
||||
inline void Foam::FixedList<T, Size>::resize(const label n)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
checkSize(s);
|
||||
checkSize(n);
|
||||
#endif
|
||||
}
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline void Foam::FixedList<T, Size>::setSize(const label s)
|
||||
inline void Foam::FixedList<T, Size>::setSize(const label n)
|
||||
{
|
||||
#ifdef FULLDEBUG
|
||||
checkSize(s);
|
||||
checkSize(n);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline void Foam::FixedList<T, Size>::transfer(const FixedList<T, Size>& lst)
|
||||
inline void Foam::FixedList<T, Size>::swap(FixedList<T, Size>& lst)
|
||||
{
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
v_[i] = lst[i];
|
||||
Foam::Swap(v_[i], lst.v_[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<class T, unsigned Size>
|
||||
inline void Foam::FixedList<T, Size>::transfer(FixedList<T, Size>& lst)
|
||||
{
|
||||
for (unsigned i=0; i<Size; ++i)
|
||||
{
|
||||
v_[i] = std::move(lst[i]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -444,7 +446,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::iterator
|
||||
Foam::FixedList<T, Size>::end()
|
||||
{
|
||||
return &v_[Size];
|
||||
return (v_ + Size);
|
||||
}
|
||||
|
||||
|
||||
@ -452,7 +454,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_iterator
|
||||
Foam::FixedList<T, Size>::end() const
|
||||
{
|
||||
return &v_[Size];
|
||||
return (v_ + Size);
|
||||
}
|
||||
|
||||
|
||||
@ -460,7 +462,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_iterator
|
||||
Foam::FixedList<T, Size>::cend() const
|
||||
{
|
||||
return &v_[Size];
|
||||
return (v_ + Size);
|
||||
}
|
||||
|
||||
|
||||
@ -468,7 +470,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::reverse_iterator
|
||||
Foam::FixedList<T, Size>::rbegin()
|
||||
{
|
||||
return reverse_iterator(&v_[Size-1]);
|
||||
return reverse_iterator(end());
|
||||
}
|
||||
|
||||
|
||||
@ -476,7 +478,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_reverse_iterator
|
||||
Foam::FixedList<T, Size>::rbegin() const
|
||||
{
|
||||
return const_reverse_iterator(&v_[Size-1]);
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
|
||||
|
||||
@ -484,7 +486,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_reverse_iterator
|
||||
Foam::FixedList<T, Size>::crbegin() const
|
||||
{
|
||||
return const_reverse_iterator(&v_[Size-1]);
|
||||
return const_reverse_iterator(end());
|
||||
}
|
||||
|
||||
|
||||
@ -492,7 +494,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::reverse_iterator
|
||||
Foam::FixedList<T, Size>::rend()
|
||||
{
|
||||
return reverse_iterator(&v_[-1]);
|
||||
return reverse_iterator(begin());
|
||||
}
|
||||
|
||||
|
||||
@ -500,7 +502,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_reverse_iterator
|
||||
Foam::FixedList<T, Size>::rend() const
|
||||
{
|
||||
return const_reverse_iterator(&v_[-1]);
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
|
||||
|
||||
@ -508,7 +510,7 @@ template<class T, unsigned Size>
|
||||
inline typename Foam::FixedList<T, Size>::const_reverse_iterator
|
||||
Foam::FixedList<T, Size>::crend() const
|
||||
{
|
||||
return const_reverse_iterator(&v_[-1]);
|
||||
return const_reverse_iterator(begin());
|
||||
}
|
||||
|
||||
|
||||
@ -562,9 +564,9 @@ inline unsigned Foam::FixedList<T, Size>::Hash<HashT>::operator()
|
||||
// * * * * * * * * * * * * * * * Global Functions * * * * * * * * * * * * * //
|
||||
|
||||
template<class T, unsigned Size>
|
||||
void Foam::Swap(FixedList<T, Size>& a, FixedList<T, Size>& b)
|
||||
inline void Foam::Swap(FixedList<T, Size>& lhs, FixedList<T, Size>& rhs)
|
||||
{
|
||||
a.swap(b);
|
||||
lhs.swap(rhs);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user