#ifndef ICE_P2_HELPERS_H
#define ICE_P2_HELPERS_H

#include <variableType.h>
#include <common.h>

template <typename T>
const VariableType &
operator>>(const VariableType & vt, T & v)
{
	v = vt.as<T>();
	return vt;
}

template <>
const VariableType &
operator>><Common::Duration>(const VariableType & vt, Common::Duration & d);

template <>
const VariableType &
operator>><Common::DateTime>(const VariableType & vt, Common::DateTime & dt);

template <typename T>
const VariableType &
operator>>(const VariableType & vt, IceUtil::Optional<T> & v)
{
	if (vt.isNull()) {
		v = IceUtil::Optional<T>();
	}
	else {
		v = T();
		vt >> *v;
	}
	return vt;
}

template <>
const VariableType &
operator>>(const VariableType & vt, short int & v);

template <typename T>
VariableType &
operator<<(VariableType & vt, const T & v)
{
	vt = v;
	return vt;
}

template <>
VariableType &
operator<<<Common::Duration>(VariableType & vt, const Common::Duration & d);

template <>
VariableType &
operator<<<Common::DateTime>(VariableType & vt, const Common::DateTime & dt);

template <typename T>
VariableType &
operator<<(VariableType & vt, const IceUtil::Optional<T> & v)
{
	if (v) {
		vt << *v;
	}
	else {
		vt = Null();
	}
	return vt;
}

#endif