mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-12-28 03:37:59 +00:00
ENH: improvements for PtrList, UPtrList and new PtrDynList container
- improve internal handling to permit deriving resizable containers (eg, PtrDynList). - include '->' iterator dereferencing - Only append/set non-const autoPtr references. This doesn't break existing code, but makes the intention more transparent.
This commit is contained in:
@ -29,7 +29,7 @@ Description
|
||||
|
||||
#include "scalar.H"
|
||||
#include "IOstreams.H"
|
||||
#include "PtrList.H"
|
||||
#include "PtrDynList.H"
|
||||
#include "DLPtrList.H"
|
||||
#include "SLPtrList.H"
|
||||
#include "plane.H"
|
||||
@ -58,6 +58,16 @@ public:
|
||||
Info<<"delete Scalar: " << data_ << endl;
|
||||
}
|
||||
|
||||
const scalar& value() const
|
||||
{
|
||||
return data_;
|
||||
}
|
||||
|
||||
scalar& value()
|
||||
{
|
||||
return data_;
|
||||
}
|
||||
|
||||
autoPtr<Scalar> clone() const
|
||||
{
|
||||
return autoPtr<Scalar>::New(data_);
|
||||
@ -71,6 +81,151 @@ public:
|
||||
};
|
||||
|
||||
|
||||
|
||||
// As per
|
||||
//
|
||||
// template<class T>
|
||||
// Ostream& operator<<(Ostream& os, const UPtrList<T>& list)
|
||||
//
|
||||
// but handle nullptr
|
||||
|
||||
template<class T>
|
||||
Ostream& printAddr
|
||||
(
|
||||
Ostream& os,
|
||||
const UPtrList<T>& list
|
||||
)
|
||||
{
|
||||
const label len = list.size();
|
||||
|
||||
// Size and start delimiter
|
||||
os << nl << indent << len << nl
|
||||
<< indent << token::BEGIN_LIST << incrIndent << nl;
|
||||
|
||||
for (label i=0; i < len; ++i)
|
||||
{
|
||||
os << "addr=" << long(list(i)) << nl;
|
||||
}
|
||||
|
||||
// End delimiter
|
||||
os << decrIndent << indent << token::END_LIST << nl;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
// As per
|
||||
//
|
||||
// template<class T>
|
||||
// Ostream& operator<<(Ostream& os, const UPtrList<T>& list)
|
||||
//
|
||||
// but handle nullptr
|
||||
|
||||
template<class T>
|
||||
Ostream& print
|
||||
(
|
||||
Ostream& os,
|
||||
const UPtrList<T>& list,
|
||||
const bool debug=false
|
||||
)
|
||||
{
|
||||
const label len = list.size();
|
||||
|
||||
// Size and start delimiter
|
||||
os << nl << indent << len << nl
|
||||
<< indent << token::BEGIN_LIST << incrIndent << nl;
|
||||
|
||||
for (label i=0; i < len; ++i)
|
||||
{
|
||||
const T* ptr = list(i);
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
os << *ptr << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << "nullptr" << nl;
|
||||
}
|
||||
}
|
||||
|
||||
// End delimiter
|
||||
os << decrIndent << indent << token::END_LIST << nl;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
template<class T, int SizeMin>
|
||||
Ostream& print
|
||||
(
|
||||
Ostream& os,
|
||||
const PtrDynList<T, SizeMin>& list,
|
||||
const bool debug=false
|
||||
)
|
||||
{
|
||||
const label len = list.size();
|
||||
|
||||
// Size and start delimiter
|
||||
os << nl << indent << len << nl
|
||||
<< indent << token::BEGIN_LIST << incrIndent << nl;
|
||||
|
||||
for (label i=0; i < len; ++i)
|
||||
{
|
||||
const T* ptr = list(i);
|
||||
|
||||
if (ptr)
|
||||
{
|
||||
os << *ptr << nl;
|
||||
}
|
||||
else
|
||||
{
|
||||
os << "nullptr" << nl;
|
||||
}
|
||||
}
|
||||
|
||||
if (debug)
|
||||
{
|
||||
const label cap = list.capacity();
|
||||
|
||||
for (label i=len; i < cap; ++i)
|
||||
{
|
||||
const T* ptr = list(i);
|
||||
|
||||
os << "unused " << long(ptr) << nl;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// End delimiter
|
||||
os << decrIndent << indent << token::END_LIST << nl;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
template<class T>
|
||||
Ostream& report
|
||||
(
|
||||
Ostream& os,
|
||||
const UPtrList<T>& list,
|
||||
const bool debug=false
|
||||
)
|
||||
{
|
||||
return print(os, list, debug);
|
||||
}
|
||||
|
||||
|
||||
template<class T, int SizeMin>
|
||||
Ostream& report
|
||||
(
|
||||
Ostream& os,
|
||||
const PtrDynList<T,SizeMin>& list,
|
||||
const bool debug=false
|
||||
)
|
||||
{
|
||||
os << "capacity=" << list.capacity() << nl;
|
||||
return print(os, list, debug);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
// Main program:
|
||||
|
||||
@ -110,6 +265,23 @@ int main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
|
||||
// Same but as SLPtrList
|
||||
{
|
||||
SLPtrList<Scalar> llist1;
|
||||
llist1.insert(new Scalar(100));
|
||||
llist1.insert(new Scalar(200));
|
||||
llist1.insert(new Scalar(300));
|
||||
|
||||
for (const auto& it : llist1)
|
||||
{
|
||||
Info<< typeid(it).name() << nl
|
||||
<< "for-: " << it << endl;
|
||||
}
|
||||
|
||||
PtrList<Scalar> list1b(llist1);
|
||||
Info<< list1b << endl;
|
||||
}
|
||||
|
||||
forAll(list1, i)
|
||||
{
|
||||
list1.set(i, new Scalar(1.3*i));
|
||||
@ -133,7 +305,7 @@ int main(int argc, char *argv[])
|
||||
Info<<"indirectly delete some items via set(.., 0) :" << endl;
|
||||
for (label i = 0; i < 3; i++)
|
||||
{
|
||||
list1.set(i, 0);
|
||||
list1.set(i, nullptr);
|
||||
}
|
||||
|
||||
Info<<"transfer list2 -> list1:" << endl;
|
||||
@ -147,6 +319,36 @@ int main(int argc, char *argv[])
|
||||
|
||||
Info<<"list1: " << list1 << endl;
|
||||
|
||||
{
|
||||
PtrList<Scalar> list1a(list1, false);
|
||||
|
||||
Info<<"Clone constructed" << endl;
|
||||
Info<<"in: " << list1 << nl
|
||||
<<"out: " << list1a << nl
|
||||
<<"addresses:" << nl;
|
||||
printAddr(Info, list1);
|
||||
printAddr(Info, list1a);
|
||||
|
||||
PtrList<Scalar> list1b(list1a, true);
|
||||
|
||||
Info<<"Reuse constructed" << endl;
|
||||
Info<<"in: " << list1a << nl
|
||||
<<"out: " << list1b << nl
|
||||
<<"addresses:" << nl;
|
||||
printAddr(Info, list1a);
|
||||
printAddr(Info, list1b);
|
||||
|
||||
|
||||
PtrList<Scalar> list1c(list1b.clone());
|
||||
|
||||
Info<<"Explicit clone()" << endl;
|
||||
Info<<"in: " << list1b << nl
|
||||
<<"out: " << list1c << nl
|
||||
<<"addresses:" << nl;
|
||||
printAddr(Info, list1b);
|
||||
printAddr(Info, list1c);
|
||||
}
|
||||
|
||||
PtrList<Scalar> list3(std::move(list1));
|
||||
Info<<"Move constructed" << endl;
|
||||
|
||||
@ -174,6 +376,26 @@ int main(int argc, char *argv[])
|
||||
UPtrList<Scalar> ulist1(list3);
|
||||
|
||||
Info<<"ulist1: " << ulist1 << nl;
|
||||
Info<<"PtrList addresses:";
|
||||
printAddr(Info, list3);
|
||||
Info<<"UPtrList addresses:";
|
||||
printAddr(Info, ulist1);
|
||||
Info<< nl;
|
||||
|
||||
{
|
||||
Info<<"UPtrList(const UPtrList&)" << nl;
|
||||
|
||||
const UPtrList<Scalar>& cref = ulist1;
|
||||
|
||||
UPtrList<Scalar> ulist1cp(cref);
|
||||
|
||||
Info<<"src addresses:";
|
||||
printAddr(Info, cref);
|
||||
Info<<"dst addresses:";
|
||||
printAddr(Info, ulist1cp);
|
||||
Info<< nl;
|
||||
}
|
||||
|
||||
|
||||
Info<<"Move construct:" << endl;
|
||||
|
||||
@ -204,6 +426,10 @@ int main(int argc, char *argv[])
|
||||
Info<< "iter[2]=" << iter1[2] << nl;
|
||||
Info<< "iter1 < iter2 : " << (iter1 < iter2) << nl;
|
||||
Info<< "iter1 >= iter2 : " << (iter1 >= iter2) << nl;
|
||||
|
||||
Info<<"->" << iter1->value() << nl;
|
||||
Info<<"*" << (*iter1).value() << nl;
|
||||
Info<<"()" << iter1().value() << nl;
|
||||
}
|
||||
|
||||
PtrList<plane> planes;
|
||||
@ -216,6 +442,46 @@ int main(int argc, char *argv[])
|
||||
Info<< " plane " << p << endl;
|
||||
}
|
||||
|
||||
Info<<"Testing PtrDynList" << nl;
|
||||
|
||||
PtrDynList<plane> dynPlanes;
|
||||
|
||||
{
|
||||
dynPlanes.append(new plane(vector::one, vector::one));
|
||||
dynPlanes.append(new plane(vector(1,2,3), vector::one));
|
||||
dynPlanes.append(nullptr);
|
||||
|
||||
dynPlanes.set(6, new plane(vector(2,2,1), vector::one));
|
||||
dynPlanes.set(10, new plane(vector(4,5,6), vector::one));
|
||||
}
|
||||
|
||||
Info<< nl << "PtrList: ";
|
||||
report(Info, dynPlanes, true);
|
||||
|
||||
dynPlanes.resize(9);
|
||||
|
||||
Info<< nl << "resize()";
|
||||
report(Info, dynPlanes, true);
|
||||
|
||||
dynPlanes.clear();
|
||||
Info<<"clear()" << nl;
|
||||
report(Info, dynPlanes);
|
||||
|
||||
Info<<"now append again" << endl;
|
||||
{
|
||||
dynPlanes.append(new plane(vector::one, vector::one));
|
||||
dynPlanes.append(new plane(vector(1,2,3), vector::one));
|
||||
|
||||
dynPlanes.set(5, new plane(vector(2,2,1), vector::one));
|
||||
}
|
||||
|
||||
report(Info, dynPlanes, true);
|
||||
|
||||
Info<<"free()" << endl;
|
||||
|
||||
dynPlanes.free();
|
||||
report(Info, dynPlanes, true);
|
||||
|
||||
Info<< nl << "Done." << endl;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -57,8 +57,6 @@ using namespace Foam;
|
||||
#include "emptyPolyPatch.H"
|
||||
#include "preservePatchTypes.H"
|
||||
#include "cellShape.H"
|
||||
#include "SLList.H"
|
||||
#include "SLPtrList.H"
|
||||
|
||||
label nPoints = 0;
|
||||
label nCells = 0;
|
||||
|
||||
Reference in New Issue
Block a user