mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
added draft of xfer<T> class
- A simple container for objects of type \<T\> that can be used for
transferring the contents rather than copying them.
- The wrapped object of type \<T\> must implement a transfer() method.
This commit is contained in:
157
src/OpenFOAM/containers/misc/xfer.H
Normal file
157
src/OpenFOAM/containers/misc/xfer.H
Normal file
@ -0,0 +1,157 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
Class
|
||||||
|
Foam::xfer
|
||||||
|
|
||||||
|
Description
|
||||||
|
A simple container for objects of type \<T\> that can be used for
|
||||||
|
transferring the contents rather than copying them.
|
||||||
|
|
||||||
|
The wrapped object of type \<T\> must implement a transfer() method.
|
||||||
|
|
||||||
|
SourceFiles
|
||||||
|
xferI.H
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef xfer_H
|
||||||
|
#define xfer_H
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
class Istream;
|
||||||
|
class Ostream;
|
||||||
|
|
||||||
|
// Forward declaration of friend functions and operators
|
||||||
|
template<class T> class xfer;
|
||||||
|
|
||||||
|
template<class T> Istream& operator>>(Istream&, xfer<T>&);
|
||||||
|
template<class T> Ostream& operator<<(Ostream&, const xfer<T>&);
|
||||||
|
|
||||||
|
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
Class xfer Declaration
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
class xfer
|
||||||
|
{
|
||||||
|
// Private data
|
||||||
|
|
||||||
|
//- Reference to the underlying datatype
|
||||||
|
T& ref_;
|
||||||
|
|
||||||
|
// Private Member Functions
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
|
xfer(const xfer<T>&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
|
void operator=(const xfer<T>&);
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct null, delaying the transfer to later
|
||||||
|
inline xfer();
|
||||||
|
|
||||||
|
//- Construct by transferring the parameter into this object
|
||||||
|
inline xfer(T&);
|
||||||
|
|
||||||
|
//- Construct by transferring the parameter into this object
|
||||||
|
inline xfer(xfer<T>&);
|
||||||
|
|
||||||
|
// Destructor
|
||||||
|
|
||||||
|
inline ~xfer();
|
||||||
|
|
||||||
|
// Member Functions
|
||||||
|
|
||||||
|
//- Access to the underlying datatype
|
||||||
|
inline T& ref();
|
||||||
|
|
||||||
|
//- Transfer the contents of the parameter into this object
|
||||||
|
inline void transfer(T&);
|
||||||
|
|
||||||
|
//- Transfer the contents of the parameter into this object
|
||||||
|
inline void transfer(xfer<T>&);
|
||||||
|
|
||||||
|
//- Transfer the contents from this object to the parameter
|
||||||
|
inline void yield(T&);
|
||||||
|
|
||||||
|
//- Transfer the contents from this object to the parameter
|
||||||
|
inline void yield(xfer<T>&);
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
//- Transfer the contents into this object
|
||||||
|
inline void operator=(T&);
|
||||||
|
|
||||||
|
//- Transfer the contents into this object
|
||||||
|
inline void operator=(xfer<T>&);
|
||||||
|
|
||||||
|
//- Return a non-const reference to const object
|
||||||
|
// Useful for read-constructors where the argument is temporary
|
||||||
|
inline xfer<T>& operator()() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Istream operator
|
||||||
|
|
||||||
|
//- Read from Istream, discarding current contents
|
||||||
|
friend Istream& operator>>
|
||||||
|
#ifndef __CINT__
|
||||||
|
<T>
|
||||||
|
#endif
|
||||||
|
(Istream&, xfer<T>&);
|
||||||
|
|
||||||
|
// Ostream operator
|
||||||
|
|
||||||
|
//- Write to Ostream
|
||||||
|
friend Ostream& operator<<
|
||||||
|
#ifndef __CINT__
|
||||||
|
<T>
|
||||||
|
#endif
|
||||||
|
(Ostream&, const xfer<T>&);
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#include "xferI.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
151
src/OpenFOAM/containers/misc/xferI.H
Normal file
151
src/OpenFOAM/containers/misc/xferI.H
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of OpenFOAM.
|
||||||
|
|
||||||
|
OpenFOAM is free software; you can redistribute it and/or modify it
|
||||||
|
under the terms of the GNU General Public License as published by the
|
||||||
|
Free Software Foundation; either version 2 of the License, or (at your
|
||||||
|
option) any later version.
|
||||||
|
|
||||||
|
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||||
|
for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with OpenFOAM; if not, write to the Free Software Foundation,
|
||||||
|
Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::xfer<T>::xfer()
|
||||||
|
:
|
||||||
|
ref_()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::xfer<T>::xfer(T& t)
|
||||||
|
:
|
||||||
|
ref_()
|
||||||
|
{
|
||||||
|
transfer(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::xfer<T>::xfer(xfer<T>& t)
|
||||||
|
:
|
||||||
|
ref_()
|
||||||
|
{
|
||||||
|
transfer(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::xfer<T>::~xfer()
|
||||||
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
T& Foam::xfer<T>::ref()
|
||||||
|
{
|
||||||
|
return ref_;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::transfer(T& t)
|
||||||
|
{
|
||||||
|
ref_.transfer(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::transfer(xfer<T>& t)
|
||||||
|
{
|
||||||
|
ref_.transfer(t.ref_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::yield(T& t)
|
||||||
|
{
|
||||||
|
t.transfer(ref_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::yield(xfer<T>& t)
|
||||||
|
{
|
||||||
|
t.ref_.transfer(ref_);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::operator=(T& t)
|
||||||
|
{
|
||||||
|
transfer(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
void Foam::xfer<T>::operator=(xfer<T>& t)
|
||||||
|
{
|
||||||
|
if (this == &t)
|
||||||
|
{
|
||||||
|
FatalErrorIn
|
||||||
|
(
|
||||||
|
"Foam::xfer<T>::operator="
|
||||||
|
"(const Foam::xfer<T>&)"
|
||||||
|
) << "Attempted assignment to self"
|
||||||
|
<< abort(FatalError);
|
||||||
|
}
|
||||||
|
|
||||||
|
transfer(t);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::xfer<T>& Foam::xfer<T>::operator()() const
|
||||||
|
{
|
||||||
|
return const_cast<xfer<T>&>(*this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * Friend Operators * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::Istream& Foam::operator>>(Istream& is, xfer<T>& t)
|
||||||
|
{
|
||||||
|
is >> t.ref_;
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
Foam::Ostream& Foam::operator<<(Ostream& os, const xfer<T>& t)
|
||||||
|
{
|
||||||
|
os << t.ref_;
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
||||||
Reference in New Issue
Block a user