GeopsyCore/MetaData.h
Go to the documentation of this file.
00001 /***************************************************************************
00002 **
00003 **  This file is part of GeopsyCore.
00004 **
00005 **  This library is free software; you can redistribute it and/or
00006 **  modify it under the terms of the GNU Lesser General Public
00007 **  License as published by the Free Software Foundation; either
00008 **  version 2.1 of the License, or (at your option) any later version.
00009 **
00010 **  This file is distributed in the hope that it will be useful, but WITHOUT
00011 **  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
00012 **  FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
00013 **  License for more details.
00014 **
00015 **  You should have received a copy of the GNU Lesser General Public
00016 **  License along with this library; if not, write to the Free Software
00017 **  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00018 **
00019 **  See http://www.geopsy.org for more information.
00020 **
00021 **  Created : 2006-08-24
00022 **  Authors :
00023 **    Marc Wathelet
00024 **    Marc Wathelet (LGIT, Grenoble, France)
00025 **
00026 ***************************************************************************/
00027 
00028 #ifndef METADATA_H
00029 #define METADATA_H
00030 
00031 #include <QGpCoreTools.h>
00032 
00033 #include "GeopsyCoreDLLExport.h"
00034 
00035 class QScriptEngine;
00036 class QScriptValue;
00037 
00038 namespace GeopsyCore {
00039 
00040   class SignalHeaderObject;
00041   class Signal;
00042 
00043   class GEOPSYCORE_EXPORT MetaData: public XMLClass, public SharedObject
00044   {
00045   public:
00046     MetaData() {}
00047     MetaData(const MetaData&) : XMLClass(), SharedObject() {}
00048     virtual ~MetaData() {}
00049 
00050     virtual MetaData * clone() const=0;
00051     virtual const MetaData * defaultValue() const=0;
00052 
00053     virtual QStringList subNames() const {return QStringList();}
00054     virtual QStringList indexList(int subId) const {Q_UNUSED(subId); return QStringList();}
00055     virtual void setId(int id) const=0;
00056     virtual int id() const=0;
00057     int key() const {return id();}
00058 
00059     virtual int count(int subId) const {Q_UNUSED(subId); return 1;}
00060     virtual bool hasIndex(int subId) const {Q_UNUSED(subId); return false;}
00061     virtual bool hasIndex(int subId, const QString& index) const {Q_UNUSED(subId); return index.isEmpty();}
00062     virtual QString name(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QString::null;}
00063     virtual QString baseName(int subId) const {Q_UNUSED(subId); return QString::null;}
00064     virtual QString title(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QString::null;}
00065     virtual Number::Type numberType(int subId) const {Q_UNUSED(subId); return Number::Fixed;}
00066     virtual bool isReadOnly(int subId) const {Q_UNUSED(subId); return false;}
00067     virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return QVariant();}
00068     virtual bool setData(int subId, const QString& index, const QVariant& val) {Q_UNUSED(subId); Q_UNUSED(index); Q_UNUSED(val); return true;}
00069     virtual int compare(int subId, const QString& index, const MetaData * o) const {Q_UNUSED(subId); Q_UNUSED(index); Q_UNUSED(o); return 0;}
00070 
00071     virtual QString toString(const QString& index) const {Q_UNUSED(index); return QString::null;}
00072     virtual bool fromString(const QString& index, QString string) {Q_UNUSED(index); Q_UNUSED(string);return true;}
00073 
00074     virtual bool isStored() const {return true;}
00075     virtual bool storeAsXML() const {return false;}
00076     virtual void writeProperties(XMLStream& s) const;
00077     virtual void writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const;
00078     void setSharedId(int id) {_sharedId=id;}
00079     void xml_writeLink(XMLStream& s) const;
00080 
00081     virtual void registerScriptTypes(QScriptEngine * engine) {Q_UNUSED(engine);}
00082     virtual void addScriptProperties(SignalHeaderObject * sig) {Q_UNUSED(sig);}
00083   private:
00084     int _sharedId;
00085   };
00086 
00087   class GEOPSYCORE_EXPORT MetaInteger: public MetaData
00088   {
00089   public:
00090     MetaInteger() {_value=0;}
00091     MetaInteger(int val) : MetaData() {_value=val;}
00092     MetaInteger(const MetaInteger& o) : MetaData(o) {_value=o._value;}
00093 
00094     int value() const {return _value;}
00095     void setValue(int v) {_value=v;}
00096 
00097     virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00098     virtual bool setData(int subId, const QString& index, const QVariant& val);
00099     virtual int compare(int subId, const QString& index, const MetaData * o) const;
00100 
00101     virtual QString toString(const QString&) const {return QString::number(_value);}
00102     virtual bool fromString(const QString& , QString string) {bool ok; setValue(string.toInt(&ok)); return ok;}
00103   private:
00104     int _value;
00105   };
00106 
00107   class GEOPSYCORE_EXPORT MetaDouble: public MetaData
00108   {
00109   public:
00110     MetaDouble() {_value=0;}
00111     MetaDouble(double val) : MetaData() {_value=val;}
00112     MetaDouble(const MetaDouble& o) : MetaData(o) {_value=o._value;}
00113 
00114     double value() const {return _value;}
00115     void setValue(double v) {_value=v;}
00116 
00117     virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00118     virtual bool setData(int subId, const QString& index, const QVariant& val);
00119     virtual int compare(int subId, const QString& index, const MetaData * o) const;
00120 
00121     virtual QString toString(const QString&) const {return QString::number(_value, 'g', 20);}
00122     virtual bool fromString(const QString& , QString string) {bool ok; setValue(string.toDouble(&ok)); return ok;}
00123   private:
00124     double _value;
00125   };
00126 
00127   template <class valueType> class GEOPSYCORE_EXPORT MetaArray: public MetaData
00128   {
00129   public:
00130     MetaArray() {_count=0;_values=0;}
00131     MetaArray(const MetaArray& o);
00132     ~MetaArray() {delete [] _values;}
00133 
00134     valueType value(int index) const {return index<_count ? _values[index] : 0;}
00135     void setValue(int index, valueType v) {if(index>=_count) enlarge(index); _values[index]=v;}
00136 
00137     virtual int count(int subId) const {Q_UNUSED(subId); return _count;}
00138     virtual bool hasIndex(int subId, const QString& index) const;
00139     virtual QVariant data(int subId, const QString& index) const;
00140 
00141     virtual void writeProperties(XMLStream& s) const;
00142     virtual void writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const;
00143   private:
00144     int _count;
00145     valueType * _values;
00146 
00147     void enlarge(int index);
00148   };
00149 
00150   template <class valueType>
00151   bool MetaArray<valueType>::hasIndex(int subId, const QString& index) const
00152   {
00153     Q_UNUSED(subId);
00154     bool ok;
00155     int i=index.toInt(&ok);
00156     return ok && i<_count && _values[i]!=0;
00157   }
00158 
00159   template <class valueType>
00160   QVariant MetaArray<valueType>::data(int subId, const QString& index) const
00161   {
00162     Q_UNUSED(subId);
00163     bool ok;
00164     int i=index.toInt(&ok);
00165     if(ok && i<_count) {
00166       return _values[i];
00167     } else {
00168       return QVariant();
00169     }
00170   }
00171 
00172   template <class valueType>
00173   void MetaArray<valueType>::enlarge(int index)
00174   {
00175     TRACE;
00176     int newSize=_count>0 ? _count : 1;
00177     while(newSize<=index) newSize=newSize << 1;
00178     valueType * tmp=new valueType[newSize];
00179     if(_values) {
00180       memcpy(tmp, _values, sizeof(valueType)*_count);
00181       delete [] _values;
00182     }
00183     memset(tmp+_count, 0, sizeof(valueType)*(newSize-_count));
00184     _values=tmp;
00185     _count=newSize;
00186   }
00187 
00188   template <class valueType>
00189   MetaArray<valueType>::MetaArray(const MetaArray& o) : MetaData(o)
00190   {
00191     _count=o._count;
00192     if(o._values) {
00193       _values=new valueType[_count];
00194       memcpy(_values, o._values, sizeof(valueType)*_count);
00195     } else {
00196       _values=0;
00197     }
00198   }
00199 
00200   template <class valueType>
00201   void MetaArray<valueType>::writeProperties(XMLStream& s) const
00202   {
00203     TRACE;
00204     if(!storeAsXML()) {
00205       static const QString key("index");
00206       XMLSaveAttributes att;
00207       QString& value=att.add(key);
00208       for(int i=0;i<_count;i++) {
00209         value=QString::number(i);
00210         if(hasIndex(0, value)) writeProperty(s,  xml_tagName(), att, toString(value));
00211       }
00212     }
00213   }
00214 
00215   template <class valueType>
00216   void MetaArray<valueType>::writeProperties(XMLStream& s, const XMLSaveAttributes& attributes) const
00217   {
00218     TRACE;
00219     if(!storeAsXML()) {
00220       static const QString key("index");
00221       XMLSaveAttributes att(attributes);
00222       QString& value=att.add(key);
00223       for(int i=0;i<_count;i++) {
00224         value=QString::number(i);
00225         if(hasIndex(0, value)) writeProperty(s,  xml_tagName(), att, toString(value));
00226       }
00227     }
00228   }
00229 
00230   class GEOPSYCORE_EXPORT MetaArrayInteger: public MetaArray<int>
00231   {
00232   public:
00233     MetaArrayInteger() : MetaArray<int>() {}
00234     MetaArrayInteger(const MetaArrayInteger& o) : MetaArray<int>(o) {}
00235 
00236     virtual bool setData(int subId, const QString& index, const QVariant& val);
00237     virtual int compare(int subId, const QString& index, const MetaData * o) const;
00238 
00239     virtual QString toString(const QString& index) const;
00240     virtual bool fromString(const QString& index, QString string);
00241   };
00242 
00243 
00244   class GEOPSYCORE_EXPORT MetaArrayDouble: public MetaArray<double>
00245   {
00246   public:
00247     MetaArrayDouble() : MetaArray<double>() {}
00248     MetaArrayDouble(const MetaArrayDouble& o) : MetaArray<double>(o) {}
00249 
00250     virtual bool setData(int subId, const QString& index, const QVariant& val);
00251     virtual int compare(int subId, const QString& index, const MetaData * o) const;
00252 
00253     virtual QString toString(const QString& index) const;
00254     virtual bool fromString(const QString& index, QString string);
00255   };
00256 
00257   class GEOPSYCORE_EXPORT MetaString: public MetaData
00258   {
00259   public:
00260     MetaString() {}
00261     MetaString(const QString& str) : MetaData() {setValue(str);}
00262     MetaString(const MetaString& o) : MetaData(o) {}
00263 
00264     virtual QVariant data(int subId, const QString& index) const {Q_UNUSED(subId); Q_UNUSED(index); return _value;}
00265     virtual bool setData(int subId, const QString& index, const QVariant& val);
00266     virtual int compare(int subId, const QString& index, const MetaData * o) const;
00267 
00268     const QString& value() const {return _value;}
00269     void setValue(const QString& v) {_value=v;}
00270 
00271     virtual QString toString(const QString& ) const {return value();}
00272     virtual bool fromString(const QString& , QString string) {setValue(string); return true;}
00273   private:
00274     QString _value;
00275   };
00276 
00277 } // namespace GeopsyCore
00278 
00279 #endif // METADATA_H
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines