~ubuntu-branches/ubuntu/trusty/kvirc/trusty-proposed

« back to all changes in this revision

Viewing changes to src/kvirc/kvs/kvi_kvs_variant.h

  • Committer: Bazaar Package Importer
  • Author(s): Kai Wasserbäch, Kai Wasserbäch, Raúl Sánchez Siles
  • Date: 2011-02-12 10:40:21 UTC
  • mfrom: (14.1.3 sid)
  • Revision ID: james.westby@ubuntu.com-20110212104021-5mh4f75jlku20mnt
The combined "Twisted Experiment" and "Nocturnal Raid" release.

[ Kai Wasserbäch ]
* Synced to upstream's SVN revision 5467.
* debian/rules:
  - Added .PHONY line.
  - Resurrect -DMANUAL_REVISION, got lost somewhere and we build SVN
    revisions again.
  - Replace "-DWITH_NO_EMBEDDED_CODE=YES" with "-DWANT_CRYPTOPP=YES".
  - Change the remaining -DWITH/-DWITHOUT to the new -DWANT syntax.
* debian/control:
  - Removed DMUA, I'm a DD now.
  - Changed my e-mail address.
  - Removed unneeded relationships (no upgrades over two releases are
    supported).
  - Fix Suggests for kvirc-dbg.
  - kvirc-data: Make the "Suggests: kvirc" a Recommends, doesn't make much
    sense to install the -data package without the program.
* debian/source/local-options: Added with "unapply-patches".
* debian/kvirc.lintian-overrides: Updated to work for 4.1.1.
* debian/patches/21_make_shared-mime-info_B-D_superfluous.patch: Updated.
* debian/kvirc-data.install: Added .notifyrc.

[ Raúl Sánchez Siles ]
* Stating the right version where kvirc-data break and replace should happen.
* Fixing link to license file.
* Added French and Portuguese man pages.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#ifndef _KVI_KVS_VARIANT_H_
2
 
#define _KVI_KVS_VARIANT_H_
3
 
//=============================================================================
4
 
//
5
 
//   File : kvi_kvs_variant.h
6
 
//   Creation date : Tue 07 Oct 2003 04:01:19 by Szymon Stefanek
7
 
//
8
 
//   This file is part of the KVIrc IRC client distribution
9
 
//   Copyright (C) 2003-2008 Szymon Stefanek <pragma at kvirc dot net>
10
 
//
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.
15
 
//
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.
20
 
//
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.
24
 
//
25
 
//=============================================================================
26
 
 
27
 
#include "kvi_settings.h"
28
 
#include "kvi_qstring.h"
29
 
#include "kvi_heapobject.h"
30
 
#include "kvi_kvs_types.h"
31
 
 
32
 
 
33
 
class KviKvsVariant;
34
 
class KviKvsArrayCast;
35
 
 
36
 
class KVIRC_API KviKvsNumber
37
 
{
38
 
        friend class KviKvsVariant;
39
 
public:
40
 
        enum DataType { Real, Integer };
41
 
protected:
42
 
        union {
43
 
                kvs_int_t     iInteger;
44
 
                kvs_real_t    dReal;
45
 
        } m_u;
46
 
        DataType m_type;
47
 
public:
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; };
53
 
};
54
 
 
55
 
// pre-declare.. the real declarations are included below
56
 
class KviKvsHash;
57
 
class KviKvsArray;
58
 
 
59
 
class KviKvsVariantData
60
 
{
61
 
public:
62
 
        enum Type {
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)
71
 
        };
72
 
public:
73
 
        unsigned int m_uRefs;
74
 
        Type m_eType;
75
 
        union {
76
 
                kvs_int_t       iInteger;
77
 
                kvs_real_t    * pReal;
78
 
                QString       * pString;
79
 
                KviKvsArray   * pArray;
80
 
                KviKvsHash    * pHash;
81
 
                bool            bBoolean;
82
 
                kvs_hobject_t   hObject;
83
 
        } m_u;
84
 
};
85
 
 
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
90
 
{
91
 
        friend class KviKvsVariantComparison;
92
 
public:
93
 
        KviKvsVariant();
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);
105
 
        ~KviKvsVariant();
106
 
protected:
107
 
        KviKvsVariantData * m_pData;
108
 
public:
109
 
        KviKvsVariantData::Type type(){ return m_pData ? m_pData->m_eType : KviKvsVariantData::Nothing; };
110
 
 
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);
120
 
        void setNothing();
121
 
        //void unset(){ setNothing(); };
122
 
 
123
 
        void getTypeName(QString &szBuffer) const;
124
 
 
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; };
135
 
 
136
 
        bool isEmpty() const;
137
 
 
138
 
        // returns true if this variant is nothing, false, null, 0 or an empty string
139
 
        bool isEqualToNothing() const;
140
 
 
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;
154
 
 
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();
163
 
 
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; };
171
 
 
172
 
        void copyFrom(const KviKvsVariant * v);
173
 
        void copyFrom(const KviKvsVariant & v);
174
 
        void takeFrom(KviKvsVariant * v);
175
 
        void takeFrom(KviKvsVariant &v);
176
 
 
177
 
        void dump(const char * prefix) const;
178
 
 
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;
183
 
 
184
 
        void operator = (const KviKvsVariant &v){ copyFrom(v); };
185
 
 
186
 
        //JSON serialization
187
 
        void serialize(QString& result);
188
 
        static void serializeString(QString& buffer);
189
 
        static KviKvsVariant* unserialize(const QString& buffer);
190
 
private:
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);
202
 
};
203
 
 
204
 
#include "kvi_kvs_array.h"
205
 
#include "kvi_kvs_hash.h"
206
 
 
207
 
#endif //!_KVI_KVS_VARIANT_H_