#ifndef __XMLIO_CAttributeTemplate_impl__ #define __XMLIO_CAttributeTemplate_impl__ #include "array.hpp" #include "type.hpp" #include "buffer_in.hpp" #include "buffer_out.hpp" namespace xmlioserver { namespace tree { /// ////////////////////// Définitions ////////////////////// /// template CAttributeTemplate::CAttributeTemplate(const StdString & id) : CAttribute(id) { /* Ne rien faire de plus */ } template CAttributeTemplate::CAttributeTemplate(const StdString & id, const T & value) : CAttribute(id) { this->setValue(value); } template CAttributeTemplate::CAttributeTemplate(const CAttribute & attribut) throw (CException) : CAttribute(attribut) { if (!attribut.isEmpty() && !attribut.isType()) ERROR("CAttributeTemplate", << "Invalid instantiation !"); } template CAttributeTemplate::CAttributeTemplate(const StdString & id, xios_map & umap) : CAttribute(id) { umap.insert(umap.end(), std::make_pair(id, this)); } template CAttributeTemplate::CAttributeTemplate (const StdString & id, const T & value, xios_map & umap) : CAttribute(id) { this->setValue(value); umap.insert(umap.end(), std::make_pair(id, this)); } template CAttributeTemplate::~CAttributeTemplate(void) { this->clear(); } ///-------------------------------------------------------------- template T CAttributeTemplate::getValue(void) const { if (SuperClass::isEmpty()) { ERROR("T CAttributeTemplate::getValue(void) const", << "[ id = " << this->getId() << "]" << " L'attribut est requis mais n'est pas défini !"); } return (SuperClass::getValue()); } template T* CAttributeTemplate::getRef(void) { if (SuperClass::isEmpty()) { ERROR("T CAttributeTemplate::getValue(void) const", << "[ id = " << this->getId() << "]" << " L'attribut est requis mais n'est pas défini !"); } return (SuperClass::getRef()); } template void CAttributeTemplate::setValue(const T & value) { SuperClass::setValue(value); } //--------------------------------------------------------------- template T CAttributeTemplate::operator=(const T & value) { this->setValue(value); return (this->getValue()); } //--------------------------------------------------------------- template StdString CAttributeTemplate::toString(void) const { StdOStringStream oss; if (!this->isEmpty() && this->hasId()) oss << this->getName() << "=\"" << this->getValue() << "\""; return (oss.str()); } template void CAttributeTemplate::fromString(const StdString & str) { ERROR("CAttributeTemplate::fromString(const StdString & str)", << "[ str = " << str << " ] Not implemented yet !"); } //--------------------------------------------------------------- template void CAttributeTemplate::toBinary (StdOStream & os) const { this->getValue()->toBinary(os); } template void CAttributeTemplate::fromBinary(StdIStream & is) { T value; FromBinary(is, value); this->setValue(value); } template bool CAttributeTemplate::toBuffer (CBufferOut& buffer) const { if (isEmpty()) return buffer.put(true) ; else { bool ret=true ; CType val(*boost::any_cast(&value)) ; ret&=buffer.put(false) ; ret&=val.toBuffer(buffer) ; return ret ; } } template bool CAttributeTemplate::fromBuffer(CBufferIn& buffer) { bool empty ; bool ret=true ; ret&=buffer.get(empty) ; if (empty) { clear() ; return ret ; } else { if (isEmpty()) { T val ; setValue(val) ; } T* V=const_cast(boost::any_cast(&value)) ; CType val(*V) ; return val.fromBuffer(buffer) ; } } template size_t CAttributeTemplate::size(void) const { if (isEmpty()) return sizeof(bool) ; else { CType val(*const_cast(boost::any_cast(&value))) ; return val.size()+sizeof(bool) ; } } //--------------------------------------------------------------- /** Spécialisations des templates pour la fonction [toString] **/ template <> StdString CAttributeTemplate::toString(void) const; //--------------------------------------------------------------- /** Spécialisations des templates pour la fonction [fromString] **/ template <> // Chaîne de caractères. void CAttributeTemplate::fromString(const StdString & str); template <> // Entier void CAttributeTemplate::fromString(const StdString & str); template <> // Booléen void CAttributeTemplate::fromString(const StdString & str); template <> // Double void CAttributeTemplate::fromString(const StdString & str); template<> // Tableau void CAttributeTemplate::fromString(const StdString & str); //--------------------------------------------------------------- /** Spécialisations des templates pour la fonction [toBinary] **/ template <> // Chaîne de caractères. void CAttributeTemplate::toBinary (StdOStream & os) const; template <> // Entier void CAttributeTemplate::toBinary(StdOStream & os) const; template <> // Booléen void CAttributeTemplate::toBinary(StdOStream & os) const; template <> // Double void CAttributeTemplate::toBinary(StdOStream & os) const; //--------------------------------------------------------------- /** Spécialisations des templates pour la fonction [fromBinary] **/ template <> // Chaîne de caractères. void CAttributeTemplate::fromBinary(StdIStream & is); template <> // Entier void CAttributeTemplate::fromBinary(StdIStream & is); template <> // Booléen void CAttributeTemplate::fromBinary(StdIStream & is); template <> // Double void CAttributeTemplate::fromBinary(StdIStream & is); ///-------------------------------------------------------------- } // namespace tree } // namespace xmlioserver #endif // __XMLIO_CAttributeTemplate_impl__