#ifndef __XIOS_TYPE_IMPL__ #define __XIOS_TYPE_IMPL__ #include "xmlioserver_spl.hpp" #include "exception.hpp" #include "buffer_in.hpp" #include "buffer_out.hpp" #include "message.hpp" namespace xmlioserver { using namespace std; template CType::CType(const T& val) { value=val ; ptrValue=&value ; clone=false ; } template CType::CType(T& val) { ptrValue=&val ; clone=false ; } template CType::CType(const CType& type) { if (type.ptrValue==&type.value) { value=type.value ; ptrValue=&value ; } else { ptrValue=type.ptrValue ; } } template void CType::fromString(const string& str) { istringstream iss(str); checkAccess() ; iss>>*ptrValue ; } template size_t CType::size(void) const { return sizeof(T) ; } template string CType::toString(void) const { ostringstream oss; checkAccess() ; oss<<*ptrValue ; return oss.str() ; } template bool CType::toBuffer(CBufferOut& buffer) const { checkAccess() ; return buffer.put(*ptrValue) ; } template bool CType::fromBuffer(CBufferIn& buffer) { checkAccess() ; return buffer.get(*ptrValue) ; } template void CType::checkAccess(void) const { // if (!isAssign) ERROR("void CType::checkAccess",<<"CType has not been assign to any buffer") ; } template CBaseType* CType::duplicate(void) const { CType* ret= new CType(*this) ; ret->clone=true ; return ret ; } template void CType::destroy(void) { if (clone) delete this ; } template CBufferOut& operator<<(CBufferOut& buffer, const CType& type) { if (!type.toBuffer(buffer)) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", <<"Buffer remain size is to low for size type") ; return buffer ; } template CBufferOut& operator<<(CBufferOut& buffer, T& type) { if (!CType(type).toBuffer(buffer)) ERROR("operator<<(CBuffer& buffer, T& type)", <<"Buffer remain size is to low for size type") ; return buffer ; } template CBufferOut& operator<<(CBufferOut& buffer, const T& type) { if (!CType(type).toBuffer(buffer)) ERROR("operator<<(CBuffer& buffer, const T& type)", <<"Buffer remain size is to low for size type") ; return buffer ; } template CBufferIn& operator>>(CBufferIn& buffer, const CType& type) { if (! const_cast & > type.fromBuffer(buffer)) ERROR("CBuffer& operator<<(CBuffer& buffer, CType& type)", <<"Buffer remain size is to low for size type") ; return buffer ; } template CBufferIn& operator>>(CBufferIn& buffer, T& type) { if (!CType(type).fromBuffer(buffer)) ERROR(" CBuffer& operator>>(CBuffer& buffer, T& type)", <<"Buffer remain size is to low for size type") ; return buffer ; } template CMessage& operator<<(CMessage& msg, const CType& type) { msg.push(*type.duplicate()) ; return msg ; } template CMessage& operator<<(CMessage& msg,CType& type) { msg.push(type) ; return msg ; } template CMessage& operator<<(CMessage& msg, const T& type) { msg.push(*CType(type).duplicate()) ; return msg ; } template CMessage& operator<<(CMessage& msg, T& type) { msg.push(*CType(type).duplicate()) ; return msg ; } } #endif