/* dtkAbstractDataComposite.tpp --- * * Author: Thibaud Kloczko * Copyright (C) 2011 - Thibaud Kloczko, Inria. * Created: Thu Sep 22 14:34:08 2011 (+0200) * Version: $Id: 0a373e61417d5dbf8182ab69f82f3bf0c7a16418 $ * Last-Updated: mar. févr. 4 11:05:04 2014 (+0100) * By: Thibaud Kloczko * Update #: 192 */ /* Commentary: * */ /* Change log: * */ #ifndef DTKABSTRACTDATACOMPOSITE_TPP #define DTKABSTRACTDATACOMPOSITE_TPP // ///////////////////////////////////////////////////////////////// // Related non-member templated functions // ///////////////////////////////////////////////////////////////// //! Casts const input \a vector of T into a const vector of //! dtkAbstractData*, provided that dynamic casting from //! T to dtkAbstractData* is valid. /*! * When input vector is empty or when dynamic cast from T to * dtkAbstractData* fails, an empty vector is returned. */ template const QVector& dtkUpCastIntoDataVector(const QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Casting failed. Returns empty vector."; return *(new QVector()); } dtkAbstractData *data = qobject_cast(vector.at(0)); if (!data) { dtkDebug() << "Input vector is not made of dtkAbstractData*. Casting failed. Returns empty vector."; return *(new QVector()); } return *(static_cast *>((void *)(&vector))); } //! Casts input \a vector of T into a vector of dtkAbstractData*, //! provided that dynamic casting from T to dtkAbstractData* is valid. /*! * When input vector is empty or when dynamic cast from T to * dtkAbstractData* fails, an empty vector is returned. */ template QVector& dtkUpCastIntoDataVector(QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Casting failed. Returns empty vector."; return *(new QVector()); } dtkAbstractData *data = qobject_cast(vector.at(0)); if (!data) { dtkDebug() << "Input vector is not made of dtkAbstractData*. Casting failed. Returns empty vector."; return *(new QVector()); } return *(static_cast *>((void *)(&vector))); } //! Casts const input \a list of T into a const list of //! dtkAbstractData*, provided that dynamic casting from //! T to dtkAbstractData* is valid. /*! * When input vector is empty or when dynamic cast from T to * dtkAbstractData* fails, an empty list is returned. */ template const QList& dtkUpCastIntoDataList(const QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Casting failed. Returns empty list."; return *(new QList()); } dtkAbstractData *data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Input list is not made of dtkAbstractData*. Casting failed. Returns empty list."; return *(new QList()); } return *(static_cast *>((void *)(&list))); } //! Casts input \a list of T into a list of dtkAbstractData*, provided //! that dynamic casting from T to dtkAbstractData* is valid. /*! * When input vector is empty or when dynamic cast from T to * dtkAbstractData* fails, an empty list is returned. */ template QList& dtkUpCastIntoDataList(QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Casting failed. Returns empty list."; return *(new QList()); } dtkAbstractData *data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Input list is not made of dtkAbstractData*. Casting failed. Returns empty list."; return *(new QList()); } return *(static_cast *>((void *)(&list))); } //! Casts const input \a vector of dtkAbstractData* into a const //! vector of type T, provided that dynamic casting from //! dtkAbstractData* to T is valid. /*! * When input vector is empty or when dynamic cast from * dtkAbstractData* to T fails, an empty vector is returned. */ template const QVector& dtkDownCastFromDataVector(const QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Casting failed. Returns empty vector."; return *(new QVector()); } T data = dynamic_cast(vector.at(0)); if (!data) { dtkDebug() << "Output vector is not made of dtkAbstractData*. Casting failed. Returns empty vector."; return *(new QVector()); } return *(static_cast *>((void *)(&vector))); } //! Casts input \a vector of dtkAbstractData* into a vector of type T, //! provided that dynamic casting from dtkAbstractData* to T is valid. /*! * When input vector is empty or when dynamic cast from * dtkAbstractData* to T fails, an empty vector is returned. */ template QVector& dtkDownCastFromDataVector(QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Casting failed. Returns empty vector."; return *(new QVector()); } T data = qobject_cast(vector.at(0)); if (!data) { dtkDebug() << "Output vector is not made of dtkAbstractData*. Casting failed. Returns empty vector."; return *(new QVector()); } return *(static_cast *>((void *)(&vector))); } //! Casts const input \a list of dtkAbstractData* into a const //! list of type T, provided that dynamic casting from //! dtkAbstractData* to T is valid. /*! * When input list is empty or when dynamic cast from * dtkAbstractData* to T fails, an empty list is returned. */ template const QList& dtkDownCastFromDataList(const QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Casting failed. Returns empty list."; return *(new QList()); } T data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Output list is not made of dtkAbstractData*. Casting failed. Returns empty list."; return *(new QList()); } return *(static_cast *>((void *)(&list))); } //! Casts input \a list of dtkAbstractData* into a list of type T, //! provided that dynamic casting from dtkAbstractData* to T is valid. /*! * When input list is empty or when dynamic cast from * dtkAbstractData* to T fails, an empty list is returned. */ template QList& dtkDownCastFromDataList(QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Casting failed. Returns empty list."; return *(new QList()); } T data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Output list is not made of dtkAbstractData*. Casting failed. Returns empty list."; return *(new QList()); } return *(static_cast *>((void *)(&list))); } //! Creates a pointer to a composite data from a copy of \a vector. /*! * Returns NULL when input type T cannot be casted into * dtkAbstractData* or when input vector is empty. */ template dtkAbstractDataComposite *dtkAbstractDataCompositeFromVectorCopy(const QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Creation failed. Returns empty composite."; return NULL; } dtkAbstractData *data = qobject_cast(vector.at(0)); if (!data) { dtkDebug() << "Input vector is not made of dtkAbstractData*. Creation failed. Returns empty composite."; return NULL; } return dtkAbstractDataComposite::createFromVectorCopy(dtkUpCastIntoDataVector(vector)); } //! Creates a pointer to a composite data from a copy of \a vector. /*! * Returns NULL when input type T cannot be casted into * dtkAbstractData* or when input vector is empty. */ template dtkAbstractDataComposite *dtkAbstractDataCompositeFromVectorCopy(QVector& vector) { if (vector.isEmpty()) { dtkDebug() << "Input vector is empty. Creation failed. Returns empty composite."; return NULL; } dtkAbstractData *data = qobject_cast(vector.at(0)); if (!data) { dtkDebug() << "Input vector is not made of dtkAbstractData*. Creation failed. Returns empty composite."; return NULL; } return dtkAbstractDataComposite::createFromVectorCopy(dtkUpCastIntoDataVector(vector)); } //! Creates a pointer to a composite data from a copy of \a list. /*! * Returns NULL when input type T cannot be casted into * dtkAbstractData* or when input list is empty. */ template dtkAbstractDataComposite *dtkAbstractDataCompositeFromListCopy(const QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Creation failed. Returns empty composite."; return NULL; } dtkAbstractData *data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Input list is not made of dtkAbstractData*. Creation failed. Returns empty composite."; return NULL; } return dtkAbstractDataComposite::createFromListCopy(dtkUpCastIntoDataVector(list)); } //! Creates a pointer to a composite data from a copy of \a list. /*! * Returns NULL when input type T cannot be casted into * dtkAbstractData* or when input list is empty. */ template dtkAbstractDataComposite *dtkAbstractDataCompositeFromListCopy(QList& list) { if (list.isEmpty()) { dtkDebug() << "Input list is empty. Creation failed. Returns empty composite."; return NULL; } dtkAbstractData *data = qobject_cast(list.at(0)); if (!data) { dtkDebug() << "Input list is not made of dtkAbstractData*. Creation failed. Returns empty composite."; return NULL; } return dtkAbstractDataComposite::createFromListCopy(dtkUpCastIntoDataVector(list)); } #endif