JValue.hh 4.09 KiB
#ifndef __JLANG__JVALUE__
#define __JLANG__JVALUE__
#include <istream>
#include <ostream>
#include <sstream>
#include <string>
#include "JLang/JAbstractIO.hh"
#include "JLang/JEquationFacet.hh"
/**
* \author mdejong
*/
namespace JLANG {}
namespace JPP { using namespace JLANG; }
namespace JLANG {
/**
* Forward declaration for friend declaration of JValueOutput inside JValueInput.
*/
template<class T>
class JValueOutput;
/**
* Wrapper class around template object.
* This class implements the JStreamInput interface.
* Note that this class can be used in conjuction with the JEquationFacet.
*/
template<class T>
class JValueInput :
public JStreamInput
{
public:
friend class JValueOutput<T>;
/**
* Constructor.
*
* \param object input object
*/
JValueInput(T& object) :
p(&object)
{}
/**
* Constructor.
*
* \param ps pointer to valid object
*/
JValueInput(void* ps) :
p((T*) ps)
{}
operator const T&() const { return *p; } //!< type conversion operator
operator T&() { return *p; } //!< type conversion operator
/**
* Stream input.
*
* \param in input stream
* \return input stream
*/
virtual std::istream& read(std::istream& in) override
{
return in >> *p;
}
protected:
T* p;
};
/**
* Wrapper class around template object.
* This class implements the JStreamOutput interface.
* Note that this class can be used in conjuction with the JEquationFacet.
*/
template<class T>
class JValueOutput :
public JStreamOutput
{
public:
/**
* Constructor.
*
* \param object input object
*/
JValueOutput(const T& object) :
p(&object)
{}
/**
* Constructor.
*
* \param object input object
*/
JValueOutput(const JValueInput<T>& object) :
p(object.p)
{}
/**
* Constructor.
*
* \param ps pointer to valid object
*/
JValueOutput(const void* ps) :
p((const T*) ps)
{}
operator const T&() const { return *p; } //!< type conversion operator
/**
* Stream output.
*
* \param out output stream
* \return output stream
*/
virtual std::ostream& write(std::ostream& out) const override
{
return out << *p;
}
protected:
const T* p;
};
/**
* Wrapper class around template object.
* This class implements the JStreamInput and JStreamOutput interfaces.
*/
template<class T>
class JValue :
public JValueInput <T>,
public JValueOutput<T>
{
public:
/**
* Constructor.
*
* \param object input object
*/
JValue(T& object) :
JValueInput <T>(&object),
JValueOutput<T>(&object)
{}
/**
* Constructor.
*
* \param ps pointer to valid object
*/
JValue(void* ps) :
JValueInput <T>(ps) ,
JValueOutput<T>(ps)
{}
};
/**
* Read JStreamInput from input stream.
*
* \param in input stream
* \param object JStreamInput
* \return input stream
*/
template<class T>
inline std::istream& operator>>(std::istream& in, JValueInput<T>& object)
{
using namespace std;
istream::sentry sentry(in); // skips white spaces
if (sentry) {
const locale& loc = in.getloc();
if (has_facet<JEquationFacet>(loc)) {
string buffer;
const JEquationFacet& facet = use_facet<JEquationFacet>(loc);
facet.getline(in, buffer);
istringstream is(buffer);
is.imbue(locale(in.getloc(), facet.clone()));
object.read(is);
if (is.fail()) {
in.setstate(ios_base::badbit);
}
} else {
object.read(in);
}
}
return in;
}
/**
* Write JStreamOutput to output stream.
*
* \param out output stream
* \param object JStreamOutput
* \return output stream
*/
template<class T>
inline std::ostream& operator<<(std::ostream& out, const JValueOutput<T>& object)
{
return object.write(out);
}
}
#endif