ENH: containers: small changes to containers

This commit is contained in:
mattijs
2015-11-11 12:44:26 +00:00
parent 8f0dfea06c
commit 7f95c64b16
9 changed files with 131 additions and 10 deletions

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -226,7 +226,7 @@ label findLower
( (
const ListType&, const ListType&,
typename ListType::const_reference, typename ListType::const_reference,
const label stary, const label start,
const BinaryOp& bop const BinaryOp& bop
); );
@ -263,6 +263,15 @@ public:
}; };
//- Helper class for list to append unique elelements of y onto the end of x
template<class T>
class ListUniqueEqOp
{
public:
void operator()(List<T>& x, const List<T>& y) const;
};
//- Reverse a list. First element becomes last element etc. //- Reverse a list. First element becomes last element etc.
template<class ListType> template<class ListType>
ListType reverseList(const ListType& list); ListType reverseList(const ListType& list);

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -742,6 +742,29 @@ void Foam::ListAppendEqOp<T>::operator()(List<T>& x, const List<T>& y) const
} }
template<class T>
void Foam::ListUniqueEqOp<T>::operator()(List<T>& x, const List<T>& y) const
{
if (y.size())
{
if (x.size())
{
forAll(y, i)
{
if (findIndex(x, y[i]) == -1)
{
x.append(y[i]);
}
}
}
else
{
x = y;
}
}
}
template<class ListType> template<class ListType>
ListType Foam::reverseList(const ListType& list) ListType Foam::reverseList(const ListType& list)
{ {

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2014 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -101,7 +101,7 @@ inline void Foam::UList<T>::checkIndex(const label i) const
if (!size_) if (!size_)
{ {
FatalErrorIn("UList<T>::checkIndex(const label)") FatalErrorIn("UList<T>::checkIndex(const label)")
<< "attempt to access element from zero sized list" << "attempt to access element " << i << " from zero sized list"
<< abort(FatalError); << abort(FatalError);
} }
else if (i<0 || i>=size_) else if (i<0 || i>=size_)

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011-2015 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -43,6 +43,30 @@ Foam::UPtrList<T>::UPtrList(const label s)
{} {}
template<class T>
Foam::UPtrList<T>::UPtrList(UList<T>& lst)
:
ptrs_(lst.size())
{
forAll(lst, i)
{
ptrs_[i] = &lst[i];
}
}
template<class T>
Foam::UPtrList<T>::UPtrList(PtrList<T>& lst)
:
ptrs_(lst.size())
{
forAll(lst, i)
{
ptrs_[i] = &lst[i];
}
}
template<class T> template<class T>
Foam::UPtrList<T>::UPtrList(const Xfer<UPtrList<T> >& lst) Foam::UPtrList<T>::UPtrList(const Xfer<UPtrList<T> >& lst)
{ {

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -42,6 +42,7 @@ SourceFiles
#define UPtrList_H #define UPtrList_H
#include "List.H" #include "List.H"
#include "PtrList.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
@ -109,6 +110,12 @@ public:
//- Construct with size specified. //- Construct with size specified.
explicit UPtrList(const label); explicit UPtrList(const label);
//- Construct from UList
explicit UPtrList(UList<T>&);
//- Construct from PtrList
explicit UPtrList(PtrList<T>&);
//- Construct by transferring the parameter contents //- Construct by transferring the parameter contents
UPtrList(const Xfer<UPtrList<T> >&); UPtrList(const Xfer<UPtrList<T> >&);

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -58,6 +58,23 @@ void Foam::CompactIOList<T, BaseType>::readFromStream()
} }
template<class T, class BaseType>
bool Foam::CompactIOList<T, BaseType>::overflows() const
{
label size = 0;
forAll(*this, i)
{
label oldSize = size;
size += this->operator[](i).size();
if (size < oldSize)
{
return true;
}
}
return false;
}
// * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * // // * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * * //
template<class T, class BaseType> template<class T, class BaseType>
@ -178,6 +195,29 @@ bool Foam::CompactIOList<T, BaseType>::writeObject
return good; return good;
} }
else if (overflows())
{
WarningIn
(
"CompactIOList<T, BaseType>::writeObject"
"(IOstream::streamFormat, IOstream::versionNumber"
", IOstream::compressionType) const"
) << "Overall number of elements of CompactIOList of size "
<< this->size() << " overflows the representation of a label"
<< endl << " Switching to ascii writing" << endl;
// Change type to be non-compact format type
const word oldTypeName = typeName;
const_cast<word&>(typeName) = IOList<T>::typeName;
bool good = regIOobject::writeObject(IOstream::ASCII, ver, cmp);
// Change type back
const_cast<word&>(typeName) = oldTypeName;
return good;
}
else else
{ {
return regIOobject::writeObject(fmt, ver, cmp); return regIOobject::writeObject(fmt, ver, cmp);
@ -264,7 +304,22 @@ Foam::Ostream& Foam::operator<<
start[0] = 0; start[0] = 0;
for (label i = 1; i < start.size(); i++) for (label i = 1; i < start.size(); i++)
{ {
start[i] = start[i-1]+L[i-1].size(); label prev = start[i-1];
start[i] = prev+L[i-1].size();
if (start[i] < prev)
{
FatalIOErrorIn
(
"operator<<"
"(Ostream& os, const CompactIOList<T, BaseType>&)",
os
) << "Overall number of elements " << start[i]
<< " of CompactIOList of size "
<< L.size() << " overflows the representation of a label"
<< endl << "Please recompile with a larger representation"
<< " for label" << exit(FatalIOError);
}
} }
List<BaseType> elems(start[start.size()-1]); List<BaseType> elems(start[start.size()-1]);

View File

@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration | \\ / O peration |
\\ / A nd | Copyright (C) 2011 OpenFOAM Foundation \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
\\/ M anipulation | \\/ M anipulation | Copyright (C) 2015 OpenCFD Ltd.
------------------------------------------------------------------------------- -------------------------------------------------------------------------------
License License
This file is part of OpenFOAM. This file is part of OpenFOAM.
@ -79,6 +79,9 @@ class CompactIOList
//- Read according to header type //- Read according to header type
void readFromStream(); void readFromStream();
//- Has too many elements in it?
bool overflows() const;
public: public:
//- Runtime type information //- Runtime type information