/* dtkComposerTransmitterVariant.tpp --- * * Author: Thibaud Kloczko, Inria. * Created: Fri Aug 3 14:31:25 2012 (+0200) */ /* Commentary: * */ /* Change log: * */ #ifndef DTKCOMPOSERTRANSMITTERVARIANT_TPP #define DTKCOMPOSERTRANSMITTERVARIANT_TPP #include "dtkComposerTransmitter.h" #include "dtkComposerTransmitter_p.h" #include "dtkComposerTransmitterVariant_p.h" #include // ///////////////////////////////////////////////////////////////// // Forward declaration of specialized method // ///////////////////////////////////////////////////////////////// template <> DTKCOMPOSERSUPPORT_EXPORT bool *dtkComposerTransmitterVariant::data(void); template <> DTKCOMPOSERSUPPORT_EXPORT qlonglong *dtkComposerTransmitterVariant::data(void); template <> DTKCOMPOSERSUPPORT_EXPORT qreal *dtkComposerTransmitterVariant::data(void); template <> DTKCOMPOSERSUPPORT_EXPORT QString *dtkComposerTransmitterVariant::data(void); // ///////////////////////////////////////////////////////////////// // // ///////////////////////////////////////////////////////////////// template void dtkComposerTransmitterVariant::setData(T *data) { d->data_type = qMetaTypeId(reinterpret_cast(0)); d->variant.setValue(data); if (d->container) { delete d->container; d->container = NULL; } if (dtkTypeInfo::dtkAbstractObjectPointer) { d->object = reinterpret_cast(data); d->matrix = NULL; } else if (dtkTypeInfo::dtkMatrixRealPointer) { d->object = NULL; d->matrix = reinterpret_cast(data); } else { d->object = NULL; d->matrix = NULL; } } template inline void dtkComposerTransmitterVariant::setData(const T *data) { this->setData(const_cast(data)); } template void dtkComposerTransmitterVariant::setData(dtkContainerVector *data) { e->data_owner = true; d->data_type = qMetaTypeId(reinterpret_cast(0)); if (!d->container) d->container = new dtkContainerVectorWrapper(data); else d->container->setVector(data); d->variant.setValue(d->container); d->object = d->container; } template inline void dtkComposerTransmitterVariant::setData(const dtkContainerVector *data) { this->setData(const_cast*>(data)); } template T *dtkComposerTransmitterVariant::data(void) { T *data = NULL; if (dtkTypeInfo::dtkAbstractObjectPointer) { dtkAbstractObject *o = this->object(); if (o && dtkTypeInfo::dtkAbstractObjectPointer) { data = reinterpret_cast(o); } else { data = this->variant().value(); } } else data = this->variant().value(); if (e->twinned) return data; if (!data) return NULL; T *m_data; if (!e->m_variant.isValid()) m_data = NULL; else m_data = e->m_variant.value(); switch (this->dataTransmission()) { case dtkComposerTransmitter::AutoCopy: if (this->enableCopy()) { if (!m_data) { if (dtkTypeInfo::dtkAbstractObjectPointer) m_data = reinterpret_cast(reinterpret_cast(data)->clone()); else m_data = new T(*data); e->m_variant.setValue(m_data); } else { *m_data = *data; } return m_data; } else { return data; } break; case dtkComposerTransmitter::Copy: if (!m_data) { if (dtkTypeInfo::dtkAbstractObjectPointer) m_data = reinterpret_cast(reinterpret_cast(data)->clone()); else m_data = new T(*data); e->m_variant.setValue(m_data); } else { *m_data = *data; } return m_data; break; case dtkComposerTransmitter::Reference: return data; break; default: break; }; return NULL; } template T *dtkComposerTransmitterVariant::constData(void) { if (this->dataTransmission() != dtkComposerTransmitter::Copy) { if (dtkTypeInfo::dtkAbstractObjectPointer) return reinterpret_cast(this->object()); else return this->variant().value(); } else { T *data = NULL; if (dtkTypeInfo::dtkAbstractObjectPointer) data = reinterpret_cast(this->object()); else data = this->variant().value(); if (e->twinned) return data; T *m_data; if (!e->m_variant.isValid()) m_data = NULL; else m_data = e->m_variant.value(); if (!m_data) { if (dtkTypeInfo::dtkAbstractObjectPointer) m_data = reinterpret_cast(reinterpret_cast(data)->clone()); else m_data = new T(*data); e->m_variant.setValue(m_data); } else { *m_data = *data; } return m_data; } return NULL; } #endif