File indexing completed on 2024-06-30 05:51:24

0001 /*
0002     This file is part of the Okteta Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2012 Alex Richardson <alex.richardson@gmx.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #ifndef KASTEN_BASICPRIMITIVEDATAINFORMATION_HPP
0010 #define KASTEN_BASICPRIMITIVEDATAINFORMATION_HPP
0011 
0012 #include "primitivedatainformation.hpp"
0013 #include "../../allprimitivetypes.hpp"
0014 
0015 /** A basic implementation for all primitive types.
0016  *  T is the data type (e.g. quint8 or float)
0017  *  C is a namespace containing all needed functions */
0018 template <typename T, class C>
0019 class BasicPrimitiveDataInformation : public PrimitiveDataInformation
0020 {
0021 public:
0022     explicit BasicPrimitiveDataInformation(const QString& name, DataInformation* parent = nullptr);
0023     ~BasicPrimitiveDataInformation() override;
0024     PrimitiveDataType type() const override;
0025     AllPrimitiveTypes value() const override;
0026     void setValue(AllPrimitiveTypes newVal) override;
0027     BasicPrimitiveDataInformation<T, C>* clone() const override;
0028 
0029     QWidget* createEditWidget(QWidget* parent) const override;
0030     QVariant dataFromWidget(const QWidget* w) const override;
0031     void setWidgetData(QWidget* w) const override;
0032 
0033     QScriptValue valueAsQScriptValue() const override;
0034     QVariant valueToQVariant() const override;
0035     QString valueToQString(AllPrimitiveTypes value) const override;
0036     QVariant valueToQVariant(AllPrimitiveTypes value) const override;
0037     BitCount32 size() const override; // TODO declare final with c++11 so it can be inlined
0038     bool setData(const QVariant& value, Okteta::AbstractByteArrayModel* out,
0039                  Okteta::Address address, BitCount64 bitsRemaining, quint8 bitOffset) override;
0040     qint64 readData(const Okteta::AbstractByteArrayModel* input, Okteta::Address address,
0041                     BitCount64 bitsRemaining, quint8* bitOffset) override;
0042 
0043 protected:
0044     BasicPrimitiveDataInformation(const BasicPrimitiveDataInformation<T, C>& d);
0045 
0046 private:
0047     QString valueStringImpl() const override;
0048     QString typeNameImpl() const override;
0049     QScriptClass* scriptClass(ScriptHandlerInfo* handlerInfo) const override;
0050 
0051 protected:
0052     T mValue = 0;
0053 };
0054 
0055 template <typename T, typename C>
0056 inline BasicPrimitiveDataInformation<T, C>::BasicPrimitiveDataInformation(const QString& name,
0057                                                                           DataInformation* parent)
0058     : PrimitiveDataInformation(name, parent)
0059 {
0060 }
0061 
0062 template <typename T, typename C>
0063 inline BasicPrimitiveDataInformation<T, C>::BasicPrimitiveDataInformation(
0064     const BasicPrimitiveDataInformation<T, C>& d)
0065     : PrimitiveDataInformation(d)
0066     , mValue(d.mValue)
0067 {
0068 }
0069 
0070 template <typename T, typename C>
0071 inline BasicPrimitiveDataInformation<T, C>::~BasicPrimitiveDataInformation() = default;
0072 
0073 template <typename T, typename C>
0074 inline QString BasicPrimitiveDataInformation<T, C>::typeNameImpl() const
0075 {
0076     return PrimitiveType::typeName(C::staticType());
0077 }
0078 
0079 template <typename T, typename C>
0080 inline AllPrimitiveTypes BasicPrimitiveDataInformation<T, C>::value() const
0081 {
0082     return AllPrimitiveTypes(mValue);
0083 }
0084 
0085 template <typename T, typename C>
0086 inline void BasicPrimitiveDataInformation<T, C>::setValue(AllPrimitiveTypes newVal)
0087 {
0088     mValue = newVal.value<T>();
0089 
0090 }
0091 
0092 template <typename T, typename C>
0093 inline BitCount32 BasicPrimitiveDataInformation<T, C>::size() const
0094 {
0095     return sizeof(T) * 8;
0096 }
0097 
0098 template <typename T, typename C>
0099 inline QVariant BasicPrimitiveDataInformation<T, C>::dataFromWidget(const QWidget* w) const
0100 {
0101     return C::staticDataFromWidget(w);
0102 }
0103 
0104 template <typename T, typename C>
0105 inline QWidget* BasicPrimitiveDataInformation<T, C>::createEditWidget(QWidget* parent) const
0106 {
0107     return C::staticCreateEditWidget(parent);
0108 }
0109 
0110 template <typename T, typename C>
0111 inline void BasicPrimitiveDataInformation<T, C>::setWidgetData(QWidget* w) const
0112 {
0113     C::staticSetWidgetData(mValue, w);
0114 }
0115 
0116 template <typename T, typename C>
0117 inline PrimitiveDataType BasicPrimitiveDataInformation<T, C>::type() const
0118 {
0119     return C::staticType();
0120 }
0121 
0122 template <typename T, typename C>
0123 inline BasicPrimitiveDataInformation<T, C>* BasicPrimitiveDataInformation<T, C>::clone() const
0124 {
0125     return new BasicPrimitiveDataInformation<T, C>(*this);
0126 }
0127 
0128 template <typename T, typename C>
0129 QString BasicPrimitiveDataInformation<T, C>::valueStringImpl() const
0130 {
0131     Q_ASSERT(mWasAbleToRead);
0132     return C::staticValueString(mValue);
0133 }
0134 
0135 template <typename T, typename C>
0136 QVariant BasicPrimitiveDataInformation<T, C>::valueToQVariant() const
0137 {
0138     return C::staticToQVariant(mValue);
0139 }
0140 
0141 template <typename T, typename C>
0142 QString BasicPrimitiveDataInformation<T, C>::valueToQString(AllPrimitiveTypes value) const
0143 {
0144     return C::staticValueString(value.value<T>());
0145 }
0146 
0147 template <typename T, typename C>
0148 QVariant BasicPrimitiveDataInformation<T, C>::valueToQVariant(AllPrimitiveTypes value) const
0149 {
0150     return C::staticToQVariant(value.value<T>());
0151 }
0152 
0153 #endif /* KASTEN_BASICPRIMITIVEDATAINFORMATION_HPP */