1
#ifndef _KVI_KVS_VARIANT_H_
2
#define _KVI_KVS_VARIANT_H_
3
//=============================================================================
5
// File : kvi_kvs_variant.h
6
// Creation date : Tue 07 Oct 2003 04:01:19 by Szymon Stefanek
8
// This file is part of the KVIrc IRC client distribution
9
// Copyright (C) 2003-2008 Szymon Stefanek <pragma at kvirc dot net>
11
// This program is FREE software. You can redistribute it and/or
12
// modify it under the terms of the GNU General Public License
13
// as published by the Free Software Foundation; either version 2
14
// of the License, or (at your opinion) any later version.
16
// This program is distributed in the HOPE that it will be USEFUL,
17
// but WITHOUT ANY WARRANTY; without even the implied warranty of
18
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19
// See the GNU General Public License for more details.
21
// You should have received a copy of the GNU General Public License
22
// along with this program. If not, write to the Free Software Foundation,
23
// Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
25
//=============================================================================
27
#include "kvi_settings.h"
28
#include "kvi_qstring.h"
29
#include "kvi_heapobject.h"
30
#include "kvi_kvs_types.h"
34
class KviKvsArrayCast;
36
class KVIRC_API KviKvsNumber
38
friend class KviKvsVariant;
40
enum DataType { Real, Integer };
48
DataType type() const { return m_type; };
49
bool isReal() const { return m_type == Real; };
50
bool isInteger() const { return m_type == Integer; };
51
kvs_real_t real() const { return m_u.dReal; };
52
kvs_int_t integer() const { return m_u.iInteger; };
55
// pre-declare.. the real declarations are included below
59
class KviKvsVariantData
63
Nothing = 0, // m_pData not initialized
64
String = 1, // QString (scalar)
65
Integer = 2, // long int (scalar)
66
Real = 4, // double (scalar)
67
Array = 8, // KviKvsArray
68
Hash = 16, // KviKvsHash
69
Boolean = 32, // bool (scalar)
70
HObject = 64 // object, shallow! (scalar)
82
kvs_hobject_t hObject;
86
// This class must not have virtual funcitons nor destructor
87
// Otherwise it will happily crash on windows when it is
88
// allocated in modules and destroyed anywhere else around...
89
class KVIRC_API KviKvsVariant : public KviHeapObject
91
friend class KviKvsVariantComparison;
94
KviKvsVariant(kvs_int_t iInteger);
95
KviKvsVariant(kvs_real_t dReal);
96
KviKvsVariant(kvs_real_t * pReal);
97
KviKvsVariant(bool bBoolean);
98
KviKvsVariant(const QString &szString);
99
KviKvsVariant(const char * szString); // without this gcc chooses the conversion (const char *)->(void *) instead of (const char *)->(QString) and obviously calls the wrong constructor
100
KviKvsVariant(QString * pString);
101
KviKvsVariant(KviKvsArray * pArray);
102
KviKvsVariant(KviKvsHash * pHash);
103
KviKvsVariant(kvs_hobject_t hObject);
104
KviKvsVariant(const KviKvsVariant &v);
107
KviKvsVariantData * m_pData;
109
KviKvsVariantData::Type type(){ return m_pData ? m_pData->m_eType : KviKvsVariantData::Nothing; };
111
void setReal(kvs_real_t dReal);
112
void setReal(kvs_real_t * pReal);
113
void setInteger(kvs_int_t iInteger);
114
void setString(const QString &szString);
115
void setString(QString * pString);
116
void setArray(KviKvsArray * pArray);
117
void setHash(KviKvsHash * pHash);
118
void setBoolean(bool bBoolean);
119
void setHObject(kvs_hobject_t hObject);
121
//void unset(){ setNothing(); };
123
void getTypeName(QString &szBuffer) const;
125
bool isNothing() const { return !m_pData; };
126
bool isInteger() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Integer) : false; };
127
bool isReal() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Real) : false; };
128
bool isNumeric() const { return m_pData ? (m_pData->m_eType & (KviKvsVariantData::Integer | KviKvsVariantData::Real)) : false; };
129
bool isString() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::String) : false; };
130
bool isScalar() const { return m_pData ? (m_pData->m_eType & (KviKvsVariantData::String | KviKvsVariantData::Integer | KviKvsVariantData::Real)) : false; };
131
bool isArray() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Array) : false; };
132
bool isHash() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Hash) : false; };
133
bool isBoolean() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Boolean) : false; };
134
bool isHObject() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::HObject) : false; };
136
bool isEmpty() const;
138
// returns true if this variant is nothing, false, null, 0 or an empty string
139
bool isEqualToNothing() const;
141
// evaluates Integer, Real and String rappresenting an Integer
142
bool asInteger(kvs_int_t &iVal) const;
143
// evaluates Real, Integer and String rappresenting a Real
144
bool asReal(kvs_real_t &dVal) const;
145
// evaluates Real, Integer and String rappresenting a Real or integer
146
bool asNumber(KviKvsNumber &n) const;
147
// always evaluates to a boolean value
148
bool asBoolean() const;
149
// evaluates to an object handle
150
bool asHObject(kvs_hobject_t &hObject) const;
151
// evaluates anything to a string
152
void asString(QString &szBuffer) const;
153
void appendAsString(QString &szBuffer) const;
155
// always evaluates to some number...
156
void castToNumber(KviKvsNumber &n) const;
157
// always evaluates to an integer
158
void castToInteger(kvs_int_t &iVal) const;
159
// always evaluates to an array
160
void castToArray(KviKvsArrayCast *c) const;
161
// converts this variant to an array
162
void convertToArray();
164
kvs_int_t integer() const { return m_pData ? m_pData->m_u.iInteger : 0; };
165
kvs_real_t real() const { return m_pData ? *(m_pData->m_u.pReal) : 0.0; };
166
const QString & string() const { return m_pData ? *(m_pData->m_u.pString) : KviQString::Empty; };
167
KviKvsArray * array() const { return m_pData ? m_pData->m_u.pArray : 0; };
168
KviKvsHash * hash() const { return m_pData ? m_pData->m_u.pHash : 0; };
169
bool boolean() const { return m_pData ? m_pData->m_u.bBoolean : false; };
170
kvs_hobject_t hobject() const { return m_pData ? m_pData->m_u.hObject : (kvs_hobject_t)0; };
172
void copyFrom(const KviKvsVariant * v);
173
void copyFrom(const KviKvsVariant & v);
174
void takeFrom(KviKvsVariant * v);
175
void takeFrom(KviKvsVariant &v);
177
void dump(const char * prefix) const;
179
// returns -1 if this variant is greater than the other, 0 if are equal, 1 if the other is greater
180
// if bPreferNumeric is true then when comparing strings a conversion to a numeric format
181
// is first attempted.
182
int compare(const KviKvsVariant * pOther,bool bPreferNumeric = false) const;
184
void operator = (const KviKvsVariant &v){ copyFrom(v); };
187
void serialize(QString& result);
188
static void serializeString(QString& buffer);
189
static KviKvsVariant* unserialize(const QString& buffer);
191
static KviKvsVariant* unserialize(const QChar** aux);
192
static KviKvsVariant* unserializeTrue(const QChar** aux);
193
static KviKvsVariant* unserializeFalse(const QChar** aux);
194
static KviKvsVariant* unserializeNull(const QChar** aux);
195
static KviKvsVariant* unserializeArray(const QChar** aux);
196
static KviKvsVariant* unserializeHash(const QChar** aux);
197
static void unserializeString(const QChar** aux,QString& buffer);
198
static KviKvsVariant* unserializeString(const QChar** aux);
199
static KviKvsVariant* unserializeRealOrInteger(const QChar** aux);
200
static KviKvsVariant* unserializeReal(const QChar** aux,QString& data);
201
static KviKvsVariant* unserializeInteger(const QChar** aux,QString& data);
204
#include "kvi_kvs_array.h"
205
#include "kvi_kvs_hash.h"
207
#endif //!_KVI_KVS_VARIANT_H_