diff options
| author | 2010-10-21 20:44:57 +0000 | |
|---|---|---|
| committer | 2010-10-21 20:44:57 +0000 | |
| commit | c24785a015853c29801c33af94bb1ca226c46431 (patch) | |
| tree | 31227b953517faa9e99d34cd8913705f4dd99d54 /src | |
| parent | updated changelog (diff) | |
| download | KVIrc-c24785a015853c29801c33af94bb1ca226c46431.tar.gz KVIrc-c24785a015853c29801c33af94bb1ca226c46431.tar.bz2 KVIrc-c24785a015853c29801c33af94bb1ca226c46431.zip | |
improved hungarian notation;
added doxygen comments;
cleaned code;
updated TODOs;
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@5102 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src')
| -rw-r--r-- | src/kvirc/kernel/kvi_defaultscript.h | 14 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_variant.cpp | 1815 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_variant.h | 839 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_variantlist.cpp | 159 | ||||
| -rw-r--r-- | src/kvirc/kvs/kvi_kvs_variantlist.h | 294 |
5 files changed, 2096 insertions, 1025 deletions
diff --git a/src/kvirc/kernel/kvi_defaultscript.h b/src/kvirc/kernel/kvi_defaultscript.h index 04962928e..5ea8ae3c2 100644 --- a/src/kvirc/kernel/kvi_defaultscript.h +++ b/src/kvirc/kernel/kvi_defaultscript.h @@ -99,16 +99,20 @@ public: /** * \brief Restores the default script + * * If this function is suggested by KVIrc, the default script will be wiped out and then * it will be reloaded. Otherwise, when the user wants to restore it, he can choose which * part of the default script have to be restored + * * This is an external helper to the real function + * \param bSuggest Whether the restore is suggested by KVIrc * \return void */ void restore(bool bSuggest = false); /** * \brief Loads the configuration of the default script + * * This is an external helper to the real function * \param szConfigFile The file where to load * \return void @@ -117,6 +121,7 @@ public: /** * \brief Saves the configuration of the default script + * * This is an external helper to the real function * \param szConfigFile The file to save * \return void @@ -125,13 +130,17 @@ public: private: /** * \brief Restores the default script + * * This is the real function + * \param bSuggest Whether the restore is suggested by KVIrc * \return void + * \todo This function still misses class clearing due to a missing function in class editor */ void restoreInternal(bool bSuggest = false); /** * \brief Loads the configuration of the default script + * * This is the real function * \param pCfg The configuration file * \return void @@ -140,6 +149,7 @@ private: /** * \brief Saves the configuration of the default script + * * This is the real function * \param pCfg The configuration file * \return void @@ -189,6 +199,7 @@ protected: protected slots: /** * \brief Enables or disables all checkboxes + * * Called when the user (de)selects the 'All' one * \return void */ @@ -196,6 +207,7 @@ protected slots: /** * \brief Open/close the advanced widget + * * Called when the user clicks on 'Advanced...' * \return void */ @@ -203,6 +215,7 @@ protected slots: /** * \brief Accepts the dialog + * * Called when the user clicks on 'Ok' * \return void */ @@ -210,6 +223,7 @@ protected slots: /** * \brief Rejects the dialog + * * Called when the user clicks on 'Cancel' or closes the dialog using the window * decoration or pressing ESC * \return void diff --git a/src/kvirc/kvs/kvi_kvs_variant.cpp b/src/kvirc/kvs/kvi_kvs_variant.cpp index fc5d4f52d..1e7bad192 100644 --- a/src/kvirc/kvs/kvi_kvs_variant.cpp +++ b/src/kvirc/kvs/kvi_kvs_variant.cpp @@ -4,7 +4,7 @@ // Creation date : Tue 07 Oct 2003 04:01:19 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution -// Copyright (C) 2003-2008 Szymon Stefanek <pragma at kvirc dot net> +// Copyright (C) 2003-2010 Szymon Stefanek <pragma at kvirc dot net> // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -22,8 +22,6 @@ // //============================================================================= - - #include "kvi_kvs_variant.h" #include "kvi_kvs_arraycast.h" #include "kvi_kvs_hash.h" @@ -31,6 +29,214 @@ #include <math.h> +int KviKvsVariantComparison::compareIntString(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + kvs_real_t dReal; + + if(pV1->m_pData->m_u.iInt == 0) + { + if(pV2->m_pData->m_u.pString->isEmpty()) + return KviKvsVariantComparison::Equal; + } + + if(pV2->asReal(dReal)) + { + if(((kvs_real_t)pV1->m_pData->m_u.iInt) == dReal) + return KviKvsVariantComparison::Equal; + if(((kvs_real_t)pV1->m_pData->m_u.iInt) > dReal) + return KviKvsVariantComparison::FirstGreater; + return KviKvsVariantComparison::SecondGreater; + } + + // compare as strings instead + QString szString; + pV1->asString(szString); + return -1 * KviQString::cmpCI(szString,*(pV2->m_pData->m_u.pString)); +} + +int KviKvsVariantComparison::compareIntReal(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(((kvs_real_t)pV1->m_pData->m_u.iInt) == *(pV2->m_pData->m_u.pReal)) + return KviKvsVariantComparison::Equal; + if(((kvs_real_t)pV1->m_pData->m_u.iInt) > *(pV2->m_pData->m_u.pReal)) + return KviKvsVariantComparison::FirstGreater; + return KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareIntBool(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.iInt == 0) + return pV2->m_pData->m_u.bBoolean ? KviKvsVariantComparison::SecondGreater : KviKvsVariantComparison::Equal; + return pV2->m_pData->m_u.bBoolean ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareIntHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.iInt == 0) + return pV2->m_pData->m_u.pHash->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareIntArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.iInt == 0) + return pV2->m_pData->m_u.pArray->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareIntHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.iInt == 0.0) + return (pV2->m_pData->m_u.hObject == (kvs_hobject_t)0) ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::FirstGreater; + return KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareRealHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(*(pV1->m_pData->m_u.pReal) == 0.0) + return (pV2->m_pData->m_u.hObject == (kvs_hobject_t)0) ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::FirstGreater; + return KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareRealString(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + kvs_real_t dReal; + + if(*(pV1->m_pData->m_u.pReal) == 0.0) + { + if(pV2->m_pData->m_u.pString->isEmpty()) + return KviKvsVariantComparison::Equal; + } + + if(pV2->asReal(dReal)) + { + if(*(pV1->m_pData->m_u.pReal) == dReal) + return KviKvsVariantComparison::Equal; + if(*(pV1->m_pData->m_u.pReal) > dReal) + return KviKvsVariantComparison::FirstGreater; + return KviKvsVariantComparison::SecondGreater; + } + + // compare as strings instead + QString szString; + pV1->asString(szString); + return -1 * KviQString::cmpCI(szString,*(pV2->m_pData->m_u.pString)); +} + +int KviKvsVariantComparison::compareRealBool(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(*(pV1->m_pData->m_u.pReal) == 0.0) + return pV2->m_pData->m_u.bBoolean ? KviKvsVariantComparison::SecondGreater : KviKvsVariantComparison::Equal; + return pV2->m_pData->m_u.bBoolean ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareRealHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(*(pV1->m_pData->m_u.pReal) == 0) + return pV2->m_pData->m_u.pHash->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareRealArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(*(pV1->m_pData->m_u.pReal) == 0) + return pV2->m_pData->m_u.pArray->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareStringHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.pString->isEmpty()) + { + return pV2->m_pData->m_u.pHash->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + } + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareStringArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.pString->isEmpty()) + { + return pV2->m_pData->m_u.pArray->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + } + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareStringHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + kvs_real_t dReal; + + if(pV2->m_pData->m_u.hObject == (kvs_hobject_t)0) + { + if(pV1->m_pData->m_u.pString->isEmpty()) + return KviKvsVariantComparison::Equal; + + if(pV1->asReal(dReal)) + { + if(dReal == 0) + return KviKvsVariantComparison::Equal; + } + } + + return KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareBoolString(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV2->isEqualToNothing()) + return pV1->m_pData->m_u.bBoolean ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; + else + return pV1->m_pData->m_u.bBoolean ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::FirstGreater; +} + +int KviKvsVariantComparison::compareBoolHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.bBoolean) + return pV2->m_pData->m_u.pHash->isEmpty() ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; + else + return pV2->m_pData->m_u.pHash->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareBoolArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.bBoolean) + return pV2->m_pData->m_u.pArray->isEmpty() ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; + else + return pV2->m_pData->m_u.pArray->isEmpty() ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareBoolHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.bBoolean) + return pV2->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; + else + return pV2->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareArrayHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV1->m_pData->m_u.pArray->size() > pV2->m_pData->m_u.pHash->size()) + return KviKvsVariantComparison::FirstGreater; + if(pV1->m_pData->m_u.pArray->size() == pV2->m_pData->m_u.pHash->size()) + return KviKvsVariantComparison::Equal; + return KviKvsVariantComparison::SecondGreater; +} + +int KviKvsVariantComparison::compareHObjectHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV2->m_pData->m_u.pHash->isEmpty()) + return pV1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return pV1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; +} + +int KviKvsVariantComparison::compareHObjectArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2) +{ + if(pV2->m_pData->m_u.pArray->isEmpty()) + return pV1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::Equal : KviKvsVariantComparison::SecondGreater; + return pV1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? KviKvsVariantComparison::FirstGreater : KviKvsVariantComparison::Equal; +} + + KviKvsVariant::KviKvsVariant() { m_pData = 0; @@ -42,25 +248,28 @@ KviKvsVariant::KviKvsVariant(QString * pString, bool bEscape) m_pData->m_eType = KviKvsVariantData::String; m_pData->m_uRefs = 1; m_pData->m_u.pString = pString; - if(bEscape) KviQString::escapeKvs(m_pData->m_u.pString); + if(bEscape) + KviQString::escapeKvs(m_pData->m_u.pString); } -KviKvsVariant::KviKvsVariant(const QString &szString, bool bEscape) +KviKvsVariant::KviKvsVariant(const QString & szString, bool bEscape) { m_pData = new KviKvsVariantData; m_pData->m_eType = KviKvsVariantData::String; m_pData->m_uRefs = 1; m_pData->m_u.pString = new QString(szString); - if(bEscape) KviQString::escapeKvs(m_pData->m_u.pString); + if(bEscape) + KviQString::escapeKvs(m_pData->m_u.pString); } -KviKvsVariant::KviKvsVariant(const char * szString, bool bEscape) +KviKvsVariant::KviKvsVariant(const char * pcString, bool bEscape) { m_pData = new KviKvsVariantData; m_pData->m_eType = KviKvsVariantData::String; m_pData->m_uRefs = 1; - m_pData->m_u.pString = new QString(QString::fromUtf8(szString)); - if(bEscape) KviQString::escapeKvs(m_pData->m_u.pString); + m_pData->m_u.pString = new QString(QString::fromUtf8(pcString)); + if(bEscape) + KviQString::escapeKvs(m_pData->m_u.pString); } KviKvsVariant::KviKvsVariant(KviKvsArray * pArray) @@ -104,12 +313,12 @@ KviKvsVariant::KviKvsVariant(bool bBoolean) m_pData->m_u.bBoolean = bBoolean; } -KviKvsVariant::KviKvsVariant(kvs_int_t iInteger, bool) +KviKvsVariant::KviKvsVariant(kvs_int_t iInt, bool) { m_pData = new KviKvsVariantData; m_pData->m_eType = KviKvsVariantData::Integer; m_pData->m_uRefs = 1; - m_pData->m_u.iInteger = iInteger; + m_pData->m_u.iInt = iInt; } KviKvsVariant::KviKvsVariant(kvs_hobject_t hObject) @@ -120,19 +329,28 @@ KviKvsVariant::KviKvsVariant(kvs_hobject_t hObject) m_pData->m_u.hObject = hObject; } -KviKvsVariant::KviKvsVariant(const KviKvsVariant &v) +KviKvsVariant::KviKvsVariant(const KviKvsVariant & variant) { - m_pData = v.m_pData; - if(m_pData)m_pData->m_uRefs++; + m_pData = variant.m_pData; + if(m_pData) + m_pData->m_uRefs++; } #define DELETE_VARIANT_CONTENTS \ switch(m_pData->m_eType) \ { \ - case KviKvsVariantData::Array: delete m_pData->m_u.pArray; break; \ - case KviKvsVariantData::Hash: delete m_pData->m_u.pHash; break; \ - case KviKvsVariantData::String: delete m_pData->m_u.pString; break; \ - case KviKvsVariantData::Real: delete m_pData->m_u.pReal; break; \ + case KviKvsVariantData::Array: \ + delete m_pData->m_u.pArray; \ + break; \ + case KviKvsVariantData::Hash: \ + delete m_pData->m_u.pHash; \ + break; \ + case KviKvsVariantData::String: \ + delete m_pData->m_u.pString; \ + break; \ + case KviKvsVariantData::Real: \ + delete m_pData->m_u.pReal; \ + break; \ default: /* make gcc happy */ break; \ } @@ -176,7 +394,7 @@ void KviKvsVariant::setString(QString * pString) m_pData->m_u.pString = pString; } -void KviKvsVariant::setString(const QString &szString) +void KviKvsVariant::setString(const QString & szString) { RENEW_VARIANT_DATA m_pData->m_eType = KviKvsVariantData::String; @@ -212,11 +430,11 @@ void KviKvsVariant::setReal(kvs_real_t * pReal) m_pData->m_u.pReal = pReal; } -void KviKvsVariant::setInteger(kvs_int_t iInteger) +void KviKvsVariant::setInteger(kvs_int_t iInt) { RENEW_VARIANT_DATA m_pData->m_eType = KviKvsVariantData::Integer; - m_pData->m_u.iInteger = iInteger; + m_pData->m_u.iInt = iInt; } void KviKvsVariant::setArray(KviKvsArray * pArray) @@ -251,13 +469,22 @@ void KviKvsVariant::setNothing() bool KviKvsVariant::isEmpty() const { - if(!m_pData)return true; + if(!m_pData) + return true; switch(m_pData->m_eType) { - case KviKvsVariantData::String: return m_pData->m_u.pString->isEmpty(); break; - case KviKvsVariantData::Array: return m_pData->m_u.pArray->isEmpty(); break; - case KviKvsVariantData::Hash: return m_pData->m_u.pHash->isEmpty(); break; - case KviKvsVariantData::HObject: return m_pData->m_u.hObject == 0; break; + case KviKvsVariantData::String: + return m_pData->m_u.pString->isEmpty(); + break; + case KviKvsVariantData::Array: + return m_pData->m_u.pArray->isEmpty(); + break; + case KviKvsVariantData::Hash: + return m_pData->m_u.pHash->isEmpty(); + break; + case KviKvsVariantData::HObject: + return m_pData->m_u.hObject == 0; + break; default: /* make gcc happy */ break; } return false; @@ -265,35 +492,52 @@ bool KviKvsVariant::isEmpty() const bool KviKvsVariant::asBoolean() const { - if(!m_pData)return false; + if(!m_pData) + return false; switch(m_pData->m_eType) { - case KviKvsVariantData::Boolean: return m_pData->m_u.bBoolean; break; + case KviKvsVariantData::Boolean: + return m_pData->m_u.bBoolean; + break; case KviKvsVariantData::String: { - if(m_pData->m_u.pString->isEmpty())return false; + if(m_pData->m_u.pString->isEmpty()) + return false; + // check integer or real values bool bOk; kvs_int_t iVal = (kvs_int_t)KviQString::toI64(*(m_pData->m_u.pString),&bOk); - if(bOk)return iVal; + if(bOk) + return iVal; kvs_real_t dVal = m_pData->m_u.pString->toDouble(&bOk); - if(bOk)return (dVal != 0.0); + if(bOk) + return (dVal != 0.0); // non number, non empty return true; } break; - case KviKvsVariantData::Integer: return m_pData->m_u.iInteger; break; - case KviKvsVariantData::Real: return *(m_pData->m_u.pReal) != 0.0; break; - case KviKvsVariantData::Array: return !(m_pData->m_u.pArray->isEmpty()); break; - case KviKvsVariantData::Hash: return !(m_pData->m_u.pHash->isEmpty()); break; - case KviKvsVariantData::HObject: return m_pData->m_u.hObject; break; + case KviKvsVariantData::Integer: + return m_pData->m_u.iInt; + break; + case KviKvsVariantData::Real: + return *(m_pData->m_u.pReal) != 0.0; + break; + case KviKvsVariantData::Array: + return !(m_pData->m_u.pArray->isEmpty()); + break; + case KviKvsVariantData::Hash: + return !(m_pData->m_u.pHash->isEmpty()); + break; + case KviKvsVariantData::HObject: + return m_pData->m_u.hObject; + break; default: /* make gcc happy */ break; } qDebug("WARNING: invalid variant type %d in KviKvsVariant::asBoolean()",m_pData->m_eType); return false; } -bool KviKvsVariant::asHObject(kvs_hobject_t &hObject) const +bool KviKvsVariant::asHObject(kvs_hobject_t & hObject) const { if(!m_pData) { @@ -308,7 +552,7 @@ bool KviKvsVariant::asHObject(kvs_hobject_t &hObject) const return true; break; case KviKvsVariantData::Integer: - if(m_pData->m_u.iInteger == 0) + if(m_pData->m_u.iInt == 0) { hObject = 0; return true; @@ -334,103 +578,110 @@ bool KviKvsVariant::asHObject(kvs_hobject_t &hObject) const return false; } -bool KviKvsVariant::asNumber(KviKvsNumber &n) const +bool KviKvsVariant::asNumber(KviKvsNumber & number) const { - if(!m_pData)return false; + if(!m_pData) + return false; if(isInteger()) { - n.m_u.iInteger = m_pData->m_u.iInteger; - n.m_type = KviKvsNumber::Integer; + number.m_u.iInt = m_pData->m_u.iInt; + number.m_type = KviKvsNumber::Integer; return true; } + if(isReal()) { - n.m_u.dReal = *(m_pData->m_u.pReal); - n.m_type = KviKvsNumber::Real; + number.m_u.dReal = *(m_pData->m_u.pReal); + number.m_type = KviKvsNumber::Real; return true; } - if(asInteger(n.m_u.iInteger)) + + if(asInteger(number.m_u.iInt)) { - n.m_type = KviKvsNumber::Integer; + number.m_type = KviKvsNumber::Integer; return true; } - if(asReal(n.m_u.dReal)) + + if(asReal(number.m_u.dReal)) { - n.m_type = KviKvsNumber::Real; + number.m_type = KviKvsNumber::Real; return true; } return false; } -void KviKvsVariant::castToNumber(KviKvsNumber &n) const +void KviKvsVariant::castToNumber(KviKvsNumber & number) const { if(!m_pData) { - n.m_u.iInteger = 0; - n.m_type = KviKvsNumber::Integer; + number.m_u.iInt = 0; + number.m_type = KviKvsNumber::Integer; return; } if(isInteger()) { - n.m_u.iInteger = m_pData->m_u.iInteger; - n.m_type = KviKvsNumber::Integer; + number.m_u.iInt = m_pData->m_u.iInt; + number.m_type = KviKvsNumber::Integer; return; } + if(isReal()) { - n.m_u.dReal = *(m_pData->m_u.pReal); - n.m_type = KviKvsNumber::Real; + number.m_u.dReal = *(m_pData->m_u.pReal); + number.m_type = KviKvsNumber::Real; return; } - if(asInteger(n.m_u.iInteger)) + + if(asInteger(number.m_u.iInt)) { - n.m_type = KviKvsNumber::Integer; + number.m_type = KviKvsNumber::Integer; return; } - if(asReal(n.m_u.dReal)) + + if(asReal(number.m_u.dReal)) { - n.m_type = KviKvsNumber::Real; + number.m_type = KviKvsNumber::Real; return; } - castToInteger(n.m_u.iInteger); - n.m_type = KviKvsNumber::Integer; + castToInteger(number.m_u.iInt); + number.m_type = KviKvsNumber::Integer; } -void KviKvsVariant::castToArray(KviKvsArrayCast *c) const +void KviKvsVariant::castToArray(KviKvsArrayCast * pCast) const { if(!m_pData) { - c->set(new KviKvsArray(),true); + pCast->set(new KviKvsArray(),true); return; } switch(m_pData->m_eType) { case KviKvsVariantData::Array: - c->set(m_pData->m_u.pArray,false); + pCast->set(m_pData->m_u.pArray,false); break; case KviKvsVariantData::Hash: { KviPointerHashTableIterator<QString,KviKvsVariant> it(*(m_pData->m_u.pHash->dict())); - KviKvsArray * a = new KviKvsArray(); + KviKvsArray * pArray = new KviKvsArray(); kvs_int_t idx = 0; - while(KviKvsVariant * v = it.current()) + while(KviKvsVariant * pVariant = it.current()) { - a->set(idx,new KviKvsVariant(*v)); + pArray->set(idx,new KviKvsVariant(*pVariant)); ++it; idx++; } - c->set(a,true); + pCast->set(pArray,true); } break; default: { // other scalars - KviKvsArray * a = new KviKvsArray(); - a->set(0,new KviKvsVariant(*this)); - c->set(a,true); + KviKvsArray * pArray = new KviKvsArray(); + pArray->set(0,new KviKvsVariant(*this)); + pCast->set(pArray,true); } break; } @@ -452,35 +703,36 @@ void KviKvsVariant::convertToArray() case KviKvsVariantData::Hash: { KviPointerHashTableIterator<QString,KviKvsVariant> it(*(m_pData->m_u.pHash->dict())); - KviKvsArray * a = new KviKvsArray(); + KviKvsArray * pArray = new KviKvsArray(); kvs_int_t idx = 0; - while(KviKvsVariant * v = it.current()) + while(KviKvsVariant * pVariant = it.current()) { - a->set(idx,new KviKvsVariant(*v)); + pArray->set(idx,new KviKvsVariant(*pVariant)); ++it; idx++; } - setArray(a); + setArray(pArray); } break; default: { // other scalars - KviKvsArray * a = new KviKvsArray(); - a->set(0,new KviKvsVariant(*this)); - setArray(a); + KviKvsArray * pArray = new KviKvsArray(); + pArray->set(0,new KviKvsVariant(*this)); + setArray(pArray); } break; } } -bool KviKvsVariant::asInteger(kvs_int_t &iVal) const +bool KviKvsVariant::asInteger(kvs_int_t & iVal) const { - if(!m_pData)return false; + if(!m_pData) + return false; switch(m_pData->m_eType) { case KviKvsVariantData::Integer: - iVal = m_pData->m_u.iInteger; + iVal = m_pData->m_u.iInt; return true; break; case KviKvsVariantData::String: @@ -509,7 +761,7 @@ bool KviKvsVariant::asInteger(kvs_int_t &iVal) const return false; } -void KviKvsVariant::castToInteger(kvs_int_t &iVal) const +void KviKvsVariant::castToInteger(kvs_int_t & iVal) const { if(!m_pData) { @@ -519,7 +771,7 @@ void KviKvsVariant::castToInteger(kvs_int_t &iVal) const switch(m_pData->m_eType) { case KviKvsVariantData::Integer: - iVal = m_pData->m_u.iInteger; + iVal = m_pData->m_u.iInt; break; case KviKvsVariantData::Boolean: iVal = m_pData->m_u.bBoolean ? 1 : 0; @@ -531,7 +783,8 @@ void KviKvsVariant::castToInteger(kvs_int_t &iVal) const { bool bOk; iVal = (kvs_int_t)KviQString::toI64(*(m_pData->m_u.pString),&bOk); - if(bOk)return; + if(bOk) + return; iVal = m_pData->m_u.pString->length(); } break; @@ -553,11 +806,12 @@ void KviKvsVariant::castToInteger(kvs_int_t &iVal) const bool KviKvsVariant::asReal(kvs_real_t & dVal) const { - if(!m_pData)return false; + if(!m_pData) + return false; switch(m_pData->m_eType) { case KviKvsVariantData::Integer: - dVal = m_pData->m_u.iInteger; + dVal = m_pData->m_u.iInt; return true; break; case KviKvsVariantData::String: @@ -580,7 +834,7 @@ bool KviKvsVariant::asReal(kvs_real_t & dVal) const return false; } -void KviKvsVariant::asString(QString &szBuffer) const +void KviKvsVariant::asString(QString & szBuffer) const { if(!m_pData) { @@ -589,12 +843,23 @@ void KviKvsVariant::asString(QString &szBuffer) const } switch(m_pData->m_eType) { - case KviKvsVariantData::String: szBuffer = *(m_pData->m_u.pString); break; - case KviKvsVariantData::Array: szBuffer = QString(); m_pData->m_u.pArray->appendAsString(szBuffer); break; - case KviKvsVariantData::Hash: szBuffer = QString(); m_pData->m_u.pHash->appendAsString(szBuffer); break; - case KviKvsVariantData::Integer: szBuffer.setNum(m_pData->m_u.iInteger); break; - case KviKvsVariantData::Real: szBuffer.setNum(*(m_pData->m_u.pReal)); break; - case KviKvsVariantData::Boolean: szBuffer.setNum(m_pData->m_u.bBoolean ? 1 : 0); break; + case KviKvsVariantData::String: + szBuffer = *(m_pData->m_u.pString); + break; + case KviKvsVariantData::Array: + szBuffer = QString(); m_pData->m_u.pArray->appendAsString(szBuffer); + break; + case KviKvsVariantData::Hash: + szBuffer = QString(); m_pData->m_u.pHash->appendAsString(szBuffer); + break; + case KviKvsVariantData::Integer: + szBuffer.setNum(m_pData->m_u.iInt); + break; + case KviKvsVariantData::Real: + szBuffer.setNum(*(m_pData->m_u.pReal)); + break; + case KviKvsVariantData::Boolean: + szBuffer.setNum(m_pData->m_u.bBoolean ? 1 : 0); break; case KviKvsVariantData::HObject: if(m_pData->m_u.hObject) KviQString::sprintf(szBuffer,"object[%lx]",m_pData->m_u.hObject); @@ -605,72 +870,102 @@ void KviKvsVariant::asString(QString &szBuffer) const } } -void KviKvsVariant::appendAsString(QString &szBuffer) const +void KviKvsVariant::appendAsString(QString & szBuffer) const { - if(!m_pData)return; + if(!m_pData) + return; switch(m_pData->m_eType) { - case KviKvsVariantData::String: szBuffer.append(*(m_pData->m_u.pString)); break; - case KviKvsVariantData::Array: m_pData->m_u.pArray->appendAsString(szBuffer); break; - case KviKvsVariantData::Hash: m_pData->m_u.pHash->appendAsString(szBuffer); break; - case KviKvsVariantData::Integer: KviQString::appendNumber(szBuffer,m_pData->m_u.iInteger); break; - case KviKvsVariantData::Real: KviQString::appendNumber(szBuffer,*(m_pData->m_u.pReal)); break; - case KviKvsVariantData::Boolean: KviQString::appendNumber(szBuffer,m_pData->m_u.bBoolean ? 1 : 0); break; - case KviKvsVariantData::HObject: szBuffer.append(m_pData->m_u.hObject ? "object" : "null-object"); break; + case KviKvsVariantData::String: + szBuffer.append(*(m_pData->m_u.pString)); + break; + case KviKvsVariantData::Array: + m_pData->m_u.pArray->appendAsString(szBuffer); + break; + case KviKvsVariantData::Hash: + m_pData->m_u.pHash->appendAsString(szBuffer); + break; + case KviKvsVariantData::Integer: + KviQString::appendNumber(szBuffer,m_pData->m_u.iInt); + break; + case KviKvsVariantData::Real: + KviQString::appendNumber(szBuffer,*(m_pData->m_u.pReal)); + break; + case KviKvsVariantData::Boolean: + KviQString::appendNumber(szBuffer,m_pData->m_u.bBoolean ? 1 : 0); + break; + case KviKvsVariantData::HObject: + szBuffer.append(m_pData->m_u.hObject ? "object" : "null-object"); + break; default: /* make gcc happy */ break; } } -void KviKvsVariant::dump(const char * prefix) const +void KviKvsVariant::dump(const char * pcPrefix) const { if(!m_pData) { - qDebug("%s Nothing [this=0x%lx]",prefix,(long unsigned int) this); + qDebug("%s Nothing [this=0x%lx]",pcPrefix,(long unsigned int)this); return; } switch(m_pData->m_eType) { - case KviKvsVariantData::String: qDebug("%s String(%s) [this=0x%lx]",prefix,m_pData->m_u.pString->toUtf8().data(),(long unsigned int)this); break; - case KviKvsVariantData::Array: qDebug("%s Array(ptr=0x%lx) [this=0x%lx]",prefix,(long unsigned int)m_pData->m_u.pArray,(long unsigned int)this); break; - case KviKvsVariantData::Hash: qDebug("%s Hash(ptr=0x%lx,dict=0x%lx) [this=0x%lx]",prefix,(long unsigned int)m_pData->m_u.pHash,(long unsigned int)m_pData->m_u.pHash->dict(),(long unsigned int)this); break; - case KviKvsVariantData::Integer: qDebug("%s Integer(%d) [this=0x%lx]",prefix,(int) m_pData->m_u.iInteger,(long unsigned int)this); break; - case KviKvsVariantData::Real: qDebug("%s Real(%f) [this=0x%lx]",prefix,*(m_pData->m_u.pReal),(long unsigned int)this); break; - case KviKvsVariantData::Boolean: qDebug("%s Boolean(%s) [this=0x%lx]",prefix,m_pData->m_u.bBoolean ? "true" : "false",(long unsigned int)this); break; - case KviKvsVariantData::HObject: qDebug("%s HObject(%lx) [this=0x%lx]",prefix,(long unsigned int)m_pData->m_u.hObject,(long unsigned int)this); break; + case KviKvsVariantData::String: + qDebug("%s String(%s) [this=0x%lx]",pcPrefix,m_pData->m_u.pString->toUtf8().data(),(long unsigned int)this); + break; + case KviKvsVariantData::Array: + qDebug("%s Array(ptr=0x%lx) [this=0x%lx]",pcPrefix,(long unsigned int)m_pData->m_u.pArray,(long unsigned int)this); + break; + case KviKvsVariantData::Hash: + qDebug("%s Hash(ptr=0x%lx,dict=0x%lx) [this=0x%lx]",pcPrefix,(long unsigned int)m_pData->m_u.pHash,(long unsigned int)m_pData->m_u.pHash->dict(),(long unsigned int)this); + break; + case KviKvsVariantData::Integer: + qDebug("%s Integer(%d) [this=0x%lx]",pcPrefix,(int) m_pData->m_u.iInt,(long unsigned int)this); + break; + case KviKvsVariantData::Real: + qDebug("%s Real(%f) [this=0x%lx]",pcPrefix,*(m_pData->m_u.pReal),(long unsigned int)this); + break; + case KviKvsVariantData::Boolean: + qDebug("%s Boolean(%s) [this=0x%lx]",pcPrefix,m_pData->m_u.bBoolean ? "true" : "false",(long unsigned int)this); + break; + case KviKvsVariantData::HObject: + qDebug("%s HObject(%lx) [this=0x%lx]",pcPrefix,(long unsigned int)m_pData->m_u.hObject,(long unsigned int)this); + break; default: /* make gcc happy */ break; } } -void KviKvsVariant::copyFrom(const KviKvsVariant * v) +void KviKvsVariant::copyFrom(const KviKvsVariant * pVariant) { DETACH_CONTENTS - m_pData = v->m_pData; - if(m_pData)m_pData->m_uRefs++; + m_pData = pVariant->m_pData; + if(m_pData) + m_pData->m_uRefs++; } -void KviKvsVariant::copyFrom(const KviKvsVariant &v) +void KviKvsVariant::copyFrom(const KviKvsVariant & variant) { DETACH_CONTENTS - m_pData = v.m_pData; - if(m_pData)m_pData->m_uRefs++; - + m_pData = variant.m_pData; + if(m_pData) + m_pData->m_uRefs++; } -void KviKvsVariant::takeFrom(KviKvsVariant * v) +void KviKvsVariant::takeFrom(KviKvsVariant * pVariant) { DETACH_CONTENTS - m_pData = v->m_pData; - v->m_pData = 0; + m_pData = pVariant->m_pData; + pVariant->m_pData = 0; } -void KviKvsVariant::takeFrom(KviKvsVariant &v) +void KviKvsVariant::takeFrom(KviKvsVariant & variant) { DETACH_CONTENTS - m_pData = v.m_pData; - v.m_pData = 0; + m_pData = variant.m_pData; + variant.m_pData = 0; } -void KviKvsVariant::getTypeName(QString &szBuffer) const +void KviKvsVariant::getTypeName(QString & szBuffer) const { if(!m_pData) { @@ -679,39 +974,57 @@ void KviKvsVariant::getTypeName(QString &szBuffer) const } switch(m_pData->m_eType) { - case KviKvsVariantData::String: szBuffer = "string"; break; - case KviKvsVariantData::Hash: szBuffer = "hash"; break; - case KviKvsVariantData::Array: szBuffer = "array"; break; - case KviKvsVariantData::Real: szBuffer = "real"; break; - case KviKvsVariantData::Integer: szBuffer = "integer"; break; - case KviKvsVariantData::Boolean: szBuffer = "boolean"; break; - case KviKvsVariantData::HObject: szBuffer = "hobject"; break; - default: szBuffer = "internal_error"; break; + case KviKvsVariantData::String: + szBuffer = "string"; + break; + case KviKvsVariantData::Hash: + szBuffer = "hash"; + break; + case KviKvsVariantData::Array: + szBuffer = "array"; + break; + case KviKvsVariantData::Real: + szBuffer = "real"; + break; + case KviKvsVariantData::Integer: + szBuffer = "integer"; + break; + case KviKvsVariantData::Boolean: + szBuffer = "boolean"; + break; + case KviKvsVariantData::HObject: + szBuffer = "hobject"; + break; + default: + szBuffer = "internal_error"; + break; } } bool KviKvsVariant::isEqualToNothing() const { - if(!m_pData)return true; + if(!m_pData) + return true; switch(m_pData->m_eType) { case KviKvsVariantData::HObject: return (m_pData->m_u.hObject == (kvs_hobject_t)0); break; case KviKvsVariantData::Integer: - return (m_pData->m_u.iInteger == 0); + return (m_pData->m_u.iInt == 0); break; case KviKvsVariantData::Real: return (*(m_pData->m_u.pReal) == 0.0); break; case KviKvsVariantData::String: - { - if(m_pData->m_u.pString->isEmpty())return true; - kvs_real_t dReal; - if(asReal(dReal)) - return dReal == 0.0; - return false; - } + { + if(m_pData->m_u.pString->isEmpty()) + return true; + kvs_real_t dReal; + if(asReal(dReal)) + return dReal == 0.0; + return false; + } break; case KviKvsVariantData::Boolean: return !m_pData->m_u.bBoolean; @@ -729,225 +1042,277 @@ bool KviKvsVariant::isEqualToNothing() const return false; } - #define CMP_THISGREATER -1 #define CMP_EQUAL 0 #define CMP_OTHERGREATER 1 -class KviKvsVariantComparison +int KviKvsVariant::compare(const KviKvsVariant * pOther, bool bPreferNumeric) const { -public: - static inline int compare_integer_string(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.iInteger == 0) - { - if(v2->m_pData->m_u.pString->isEmpty())return CMP_EQUAL; - } - kvs_real_t dReal; - if(v2->asReal(dReal)) - { - if(((kvs_real_t)v1->m_pData->m_u.iInteger) == dReal)return CMP_EQUAL; - if(((kvs_real_t)v1->m_pData->m_u.iInteger) > dReal)return CMP_THISGREATER; - return CMP_OTHERGREATER; - } - // compare as strings instead - QString szString; - v1->asString(szString); - return -1 * KviQString::cmpCI(szString,*(v2->m_pData->m_u.pString)); - } - - static inline int compare_integer_real(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(((kvs_real_t)v1->m_pData->m_u.iInteger) == *(v2->m_pData->m_u.pReal))return CMP_EQUAL; - if(((kvs_real_t)v1->m_pData->m_u.iInteger) > *(v2->m_pData->m_u.pReal))return CMP_THISGREATER; - return CMP_OTHERGREATER; - } - - static inline int compare_integer_boolean(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.iInteger == 0) - return v2->m_pData->m_u.bBoolean ? CMP_OTHERGREATER : CMP_EQUAL; - return v2->m_pData->m_u.bBoolean ? CMP_EQUAL : CMP_THISGREATER; - } - - static inline int compare_integer_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.iInteger == 0) - return v2->m_pData->m_u.pHash->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - return CMP_THISGREATER; - } - - static inline int compare_integer_array(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.iInteger == 0) - return v2->m_pData->m_u.pArray->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - return CMP_THISGREATER; - } - - static inline int compare_integer_hobject(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.iInteger == 0.0) - return (v2->m_pData->m_u.hObject == (kvs_hobject_t)0) ? CMP_EQUAL : CMP_THISGREATER; - return CMP_OTHERGREATER; - } - - static inline int compare_real_hobject(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(*(v1->m_pData->m_u.pReal) == 0.0) - return (v2->m_pData->m_u.hObject == (kvs_hobject_t)0) ? CMP_EQUAL : CMP_THISGREATER; - return CMP_OTHERGREATER; - } - - static inline int compare_real_string(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(*(v1->m_pData->m_u.pReal) == 0.0) - { - if(v2->m_pData->m_u.pString->isEmpty())return CMP_EQUAL; - } - kvs_real_t dReal; - if(v2->asReal(dReal)) - { - if(*(v1->m_pData->m_u.pReal) == dReal)return CMP_EQUAL; - if(*(v1->m_pData->m_u.pReal) > dReal)return CMP_THISGREATER; - return CMP_OTHERGREATER; - } - // compare as strings instead - QString szString; - v1->asString(szString); - return -1 * KviQString::cmpCI(szString,*(v2->m_pData->m_u.pString)); - } - - static inline int compare_real_boolean(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(*(v1->m_pData->m_u.pReal) == 0.0) - return v2->m_pData->m_u.bBoolean ? CMP_OTHERGREATER : CMP_EQUAL; - return v2->m_pData->m_u.bBoolean ? CMP_EQUAL : CMP_THISGREATER; - } - - static inline int compare_real_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(*(v1->m_pData->m_u.pReal) == 0) - return v2->m_pData->m_u.pHash->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - return CMP_THISGREATER; - } - - static inline int compare_real_array(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(*(v1->m_pData->m_u.pReal) == 0) - return v2->m_pData->m_u.pArray->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - return CMP_THISGREATER; - } - - static inline int compare_string_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.pString->isEmpty()) - { - return v2->m_pData->m_u.pHash->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - } - return CMP_THISGREATER; - } - - static inline int compare_string_array(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.pString->isEmpty()) - { - return v2->m_pData->m_u.pArray->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - } - return CMP_THISGREATER; - } + if(!pOther) + return isEqualToNothing() ? CMP_EQUAL : CMP_THISGREATER; + if(!pOther->m_pData) + return isEqualToNothing() ? CMP_EQUAL : CMP_THISGREATER; + if(!m_pData) + return pOther->isEqualToNothing() ? CMP_EQUAL : CMP_OTHERGREATER; - static inline int compare_string_hobject(const KviKvsVariant * v1,const KviKvsVariant * v2) + switch(m_pData->m_eType) { - if(v2->m_pData->m_u.hObject == (kvs_hobject_t)0) - { - if(v1->m_pData->m_u.pString->isEmpty()) - return CMP_EQUAL; - kvs_real_t dReal; - if(v1->asReal(dReal)) + case KviKvsVariantData::HObject: + switch(pOther->m_pData->m_eType) { - if(dReal == 0)return CMP_EQUAL; + case KviKvsVariantData::HObject: + if(m_pData->m_u.hObject == pOther->m_pData->m_u.hObject) + return CMP_EQUAL; + if(m_pData->m_u.hObject == ((kvs_hobject_t)0)) + return CMP_OTHERGREATER; + return CMP_THISGREATER; + break; + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntHObject(pOther,this); + break; + case KviKvsVariantData::Real: + return -1 * KviKvsVariantComparison::compareRealHObject(pOther,this); + break; + case KviKvsVariantData::String: + return -1 * KviKvsVariantComparison::compareStringHObject(pOther,this); + break; + case KviKvsVariantData::Boolean: + return -1 * KviKvsVariantComparison::compareBoolHObject(pOther,this); + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareHObjectHash(this,pOther); + break; + case KviKvsVariantData::Array: + return KviKvsVariantComparison::compareHObjectArray(this,pOther); + break; + default: // just make gcc happy + break; } - } - - return CMP_THISGREATER; - } - - static inline int compare_boolean_string(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v2->isEqualToNothing()) - { - return v1->m_pData->m_u.bBoolean ? CMP_THISGREATER : CMP_EQUAL; - } else { - return v1->m_pData->m_u.bBoolean ? CMP_EQUAL : CMP_THISGREATER; - } - } - - static inline int compare_boolean_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.bBoolean) - return v2->m_pData->m_u.pHash->isEmpty() ? CMP_THISGREATER : CMP_EQUAL; - else - return v2->m_pData->m_u.pHash->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - } - - static inline int compare_boolean_array(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.bBoolean) - return v2->m_pData->m_u.pArray->isEmpty() ? CMP_THISGREATER : CMP_EQUAL; - else - return v2->m_pData->m_u.pArray->isEmpty() ? CMP_EQUAL : CMP_OTHERGREATER; - } - - static inline int compare_boolean_hobject(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.bBoolean) - return v2->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_THISGREATER : CMP_EQUAL; - else - return v2->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_EQUAL : CMP_OTHERGREATER; - } - - static inline int compare_array_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v1->m_pData->m_u.pArray->size() > v2->m_pData->m_u.pHash->size())return CMP_THISGREATER; - if(v1->m_pData->m_u.pArray->size() == v2->m_pData->m_u.pHash->size())return CMP_EQUAL; - return CMP_OTHERGREATER; - } - - static inline int compare_hobject_hash(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v2->m_pData->m_u.pHash->isEmpty()) - return v1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_EQUAL : CMP_OTHERGREATER; - return v1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_THISGREATER : CMP_EQUAL; - } - - static inline int compare_hobject_array(const KviKvsVariant * v1,const KviKvsVariant * v2) - { - if(v2->m_pData->m_u.pArray->isEmpty()) - return v1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_EQUAL : CMP_OTHERGREATER; - return v1->m_pData->m_u.hObject == ((kvs_hobject_t)0) ? CMP_THISGREATER : CMP_EQUAL; + break; + case KviKvsVariantData::Integer: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::HObject: + return KviKvsVariantComparison::compareIntHObject(this,pOther); + break; + case KviKvsVariantData::Integer: + if(m_pData->m_u.iInt == pOther->m_pData->m_u.iInt) + return CMP_EQUAL; + if(m_pData->m_u.iInt > pOther->m_pData->m_u.iInt) + return CMP_THISGREATER; + return CMP_OTHERGREATER; + break; + case KviKvsVariantData::Real: + return KviKvsVariantComparison::compareIntReal(this,pOther); + break; + case KviKvsVariantData::String: + return KviKvsVariantComparison::compareIntString(this,pOther); + break; + case KviKvsVariantData::Boolean: + return KviKvsVariantComparison::compareIntBool(this,pOther); + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareIntHash(this,pOther); + break; + case KviKvsVariantData::Array: + return KviKvsVariantComparison::compareIntArray(this,pOther); + break; + default: // just make gcc happy + break; + } + break; + case KviKvsVariantData::Real: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::HObject: + return KviKvsVariantComparison::compareRealHObject(this,pOther); + break; + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntReal(pOther,this); + break; + case KviKvsVariantData::Real: + if(*(m_pData->m_u.pReal) == *(pOther->m_pData->m_u.pReal)) + return CMP_EQUAL; + if(*(m_pData->m_u.pReal) > *(pOther->m_pData->m_u.pReal)) + return CMP_THISGREATER; + return CMP_OTHERGREATER; + break; + case KviKvsVariantData::String: + return KviKvsVariantComparison::compareRealString(this,pOther); + break; + case KviKvsVariantData::Boolean: + return KviKvsVariantComparison::compareRealBool(this,pOther); + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareRealHash(this,pOther); + break; + case KviKvsVariantData::Array: + return KviKvsVariantComparison::compareRealArray(this,pOther); + break; + default: // just make gcc happy + break; + } + break; + case KviKvsVariantData::String: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::String: + if(bPreferNumeric) + { + // prefer numeric comparison + double dReal1; + double dReal2; + if(asReal(dReal1)) + { + if(pOther->asReal(dReal2)) + { + if(dReal1 == dReal2) + return CMP_EQUAL; + if(dReal1 > dReal2) + return CMP_THISGREATER; + return CMP_OTHERGREATER; + } + } + } + return -1 * KviQString::cmpCI(*(m_pData->m_u.pString),*(pOther->m_pData->m_u.pString)); + case KviKvsVariantData::Real: + return -1 * KviKvsVariantComparison::compareRealString(pOther,this); + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntString(pOther,this); + case KviKvsVariantData::Boolean: + return -1 * KviKvsVariantComparison::compareBoolString(pOther,this); + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareStringHash(this,pOther); + break; + case KviKvsVariantData::Array: + return KviKvsVariantComparison::compareStringArray(this,pOther); + break; + case KviKvsVariantData::HObject: + return KviKvsVariantComparison::compareStringHObject(this,pOther); + break; + default: + break; + } + break; + case KviKvsVariantData::Hash: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::String: + return -1 * KviKvsVariantComparison::compareStringHash(pOther,this); + case KviKvsVariantData::Real: + return -1 * KviKvsVariantComparison::compareRealHash(pOther,this); + break; + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntHash(pOther,this); + break; + case KviKvsVariantData::Boolean: + return -1 * KviKvsVariantComparison::compareBoolHash(pOther,this); + break; + case KviKvsVariantData::Hash: + if(m_pData->m_u.pHash->size() > pOther->m_pData->m_u.pHash->size()) + return CMP_THISGREATER; + if(m_pData->m_u.pHash->size() == pOther->m_pData->m_u.pHash->size()) + return CMP_EQUAL; + return CMP_OTHERGREATER; + break; + case KviKvsVariantData::Array: + return -1 * KviKvsVariantComparison::compareArrayHash(pOther,this); + break; + case KviKvsVariantData::HObject: + return -1 * KviKvsVariantComparison::compareHObjectHash(pOther,this); + break; + default: + break; + } + break; + case KviKvsVariantData::Array: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::String: + return -1 * KviKvsVariantComparison::compareStringArray(pOther,this); + case KviKvsVariantData::Real: + return -1 * KviKvsVariantComparison::compareRealArray(pOther,this); + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntArray(pOther,this); + case KviKvsVariantData::Boolean: + return -1 * KviKvsVariantComparison::compareBoolArray(pOther,this); + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareArrayHash(this,pOther); + break; + case KviKvsVariantData::Array: + if(m_pData->m_u.pArray->size() > pOther->m_pData->m_u.pArray->size()) + return CMP_THISGREATER; + if(m_pData->m_u.pArray->size() == pOther->m_pData->m_u.pArray->size()) + return CMP_EQUAL; + return CMP_OTHERGREATER; + break; + case KviKvsVariantData::HObject: + return -1 * KviKvsVariantComparison::compareHObjectArray(pOther,this); + break; + default: + break; + } + break; + case KviKvsVariantData::Boolean: + switch(pOther->m_pData->m_eType) + { + case KviKvsVariantData::String: + return KviKvsVariantComparison::compareBoolString(this,pOther); + break; + case KviKvsVariantData::Real: + return -1 * KviKvsVariantComparison::compareRealBool(pOther,this); + break; + case KviKvsVariantData::Integer: + return -1 * KviKvsVariantComparison::compareIntBool(pOther,this); + break; + case KviKvsVariantData::Boolean: + if(m_pData->m_u.bBoolean == pOther->m_pData->m_u.bBoolean) + return CMP_EQUAL; + if(m_pData->m_u.bBoolean) + return CMP_THISGREATER; + return CMP_OTHERGREATER; + break; + case KviKvsVariantData::Hash: + return KviKvsVariantComparison::compareBoolHash(this,pOther); + break; + case KviKvsVariantData::Array: + return KviKvsVariantComparison::compareBoolArray(this,pOther); + break; + case KviKvsVariantData::HObject: + return KviKvsVariantComparison::compareBoolHObject(this,pOther); + break; + default: + break; + } + break; + default: // should never happen anyway + break; } -}; + return CMP_THISGREATER; // should never happen +} -void KviKvsVariant::serializeString(QString& buffer) +void KviKvsVariant::serializeString(QString & szBuffer) { - buffer.replace('\\',"\\\\"); - buffer.replace('\n',"\\n"); - buffer.replace('\r',"\\r"); - buffer.replace('\b',"\\b"); - buffer.replace('\t',"\\t"); - buffer.replace('\f',"\\f"); - buffer.replace('/',"\\/"); - buffer.replace('"',"\\\""); - buffer.prepend('"'); - buffer.append('"'); + szBuffer.replace('\\',"\\\\"); + szBuffer.replace('\n',"\\n"); + szBuffer.replace('\r',"\\r"); + szBuffer.replace('\b',"\\b"); + szBuffer.replace('\t',"\\t"); + szBuffer.replace('\f',"\\f"); + szBuffer.replace('/',"\\/"); + szBuffer.replace('"',"\\\""); + szBuffer.prepend('"'); + szBuffer.append('"'); } -void KviKvsVariant::serialize(QString& result) +void KviKvsVariant::serialize(QString & szResult) { if(!m_pData) { - result = "null"; + szResult = "null"; return; } @@ -957,265 +1322,350 @@ void KviKvsVariant::serialize(QString& result) //can't serialize objects yet break; case KviKvsVariantData::Integer: - result.setNum(m_pData->m_u.iInteger); + szResult.setNum(m_pData->m_u.iInt); break; case KviKvsVariantData::Real: - result.setNum(*(m_pData->m_u.pReal)); + szResult.setNum(*(m_pData->m_u.pReal)); break; case KviKvsVariantData::String: - result = *(m_pData->m_u.pString); - serializeString(result); + szResult = *(m_pData->m_u.pString); + serializeString(szResult); break; case KviKvsVariantData::Boolean: - result = m_pData->m_u.bBoolean ? "true" : "false"; + szResult = m_pData->m_u.bBoolean ? "true" : "false"; break; case KviKvsVariantData::Hash: - m_pData->m_u.pHash->serialize(result); + m_pData->m_u.pHash->serialize(szResult); break; case KviKvsVariantData::Array: - m_pData->m_u.pArray->serialize(result); + m_pData->m_u.pArray->serialize(szResult); break; case KviKvsVariantData::Nothing: - result = "null"; + szResult = "null"; break; default: // just make gcc happy break; } } -KviKvsVariant* KviKvsVariant::unserializeTrue(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserialize(const QString & szBuffer) +{ + KviKvsVariant * pResult = 0; + + const QChar * pAux = (const QChar *)szBuffer.constData(); + + pResult = unserialize(&pAux); + + if(pAux->unicode()) + { + //strange extra characters? + if(pResult) + delete pResult; + pResult = 0; + } + + return pResult; +} + +KviKvsVariant * KviKvsVariant::unserialize(const QChar ** ppAux) { - if(KviQString::equalCIN(QString("true"),*aux,4)) + KviKvsVariant * pResult = 0; + + while((*ppAux)->isSpace()) + (*ppAux)++; + + switch((*ppAux)->unicode()) { - (*aux)+=4; - return new KviKvsVariant(true); + case 't': + //true + pResult = unserializeBool(ppAux,true); + break; + case 'f': + //false + pResult = unserializeBool(ppAux,false); + break; + case 'n': + //null + pResult = unserializeNull(ppAux); + break; + case '[': + //array + pResult = unserializeArray(ppAux); + break; + case '{': + //hash + pResult = unserializeHash(ppAux); + break; + case '"': + //string + pResult = unserializeString(ppAux); + break; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case '-': + //real or integer + pResult = unserializeNumber(ppAux); + break; + default: + //incorrect value + return 0; } - return 0; + + while((*ppAux)->isSpace()) + (*ppAux)++; + + return pResult; } -KviKvsVariant* KviKvsVariant::unserializeFalse(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeBool(const QChar ** ppAux, bool bBool) { - if(KviQString::equalCIN(QString("false"),*aux,5)) + bool bOk = false; + + if(bBool) { - (*aux)+=5; - return new KviKvsVariant(false); + if(KviQString::equalCIN(QString("true"),*ppAux,4)) + { + (*ppAux) += 4; + bOk = true; + } + } else { + if(KviQString::equalCIN(QString("false"),*ppAux,5)) + { + (*ppAux) += 5; + bOk = true; + } } + + if(bOk) + return new KviKvsVariant(bBool); return 0; } -KviKvsVariant* KviKvsVariant::unserializeNull(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeNull(const QChar ** ppAux) { - if(KviQString::equalCIN(QString("null"),*aux,4)) + if(KviQString::equalCIN(QString("null"),*ppAux,4)) { - (*aux)+=4; + (*ppAux) += 4; return new KviKvsVariant(); } return 0; } -KviKvsVariant* KviKvsVariant::unserializeRealOrInteger(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeNumber(const QChar ** ppAux) { - QString data; - if((*aux)->unicode() == '-') + QString szData; + + if((*ppAux)->unicode() == '-') { - data.append('-'); - (*aux)++; + szData.append('-'); + (*ppAux)++; } - if(!(*aux)->isDigit()) + + if(!(*ppAux)->isDigit()) { return 0; } - while((*aux)->isDigit()) + + while((*ppAux)->isDigit()) { - data.append(**aux); - (*aux)++; + szData.append(**ppAux); + (*ppAux)++; } - if((*aux)->unicode()=='.') + + if((*ppAux)->unicode() == '.') { - return unserializeReal(aux,data); + return unserializeReal(ppAux,szData); } - return unserializeInteger(aux,data); + + return unserializeInteger(ppAux,szData); } -KviKvsVariant* KviKvsVariant::unserializeReal(const QChar** aux,QString& data) +KviKvsVariant * KviKvsVariant::unserializeReal(const QChar ** ppAux, QString & szData) { - QString exponent; - (*aux)++; //skip . - data.append('.'); - while((*aux)->isDigit()) + QString szExponent; + (*ppAux)++; //skip . + szData.append('.'); + while((*ppAux)->isDigit()) { - data.append(**aux); - (*aux)++; + szData.append(**ppAux); + (*ppAux)++; } - if((*aux)->unicode() == 'e' || (*aux)->unicode() == 'E') + if((*ppAux)->unicode() == 'e' || (*ppAux)->unicode() == 'E') { - (*aux)++; - if((*aux)->unicode() == '-') + (*ppAux)++; + if((*ppAux)->unicode() == '-') { - exponent.append('-'); - (*aux)++; + szExponent.append('-'); + (*ppAux)++; } else { - if((*aux)->unicode() == '+') + if((*ppAux)->unicode() == '+') { - exponent.append('+'); - (*aux)++; + szExponent.append('+'); + (*ppAux)++; } } - while((*aux)->isDigit()) + while((*ppAux)->isDigit()) { - exponent.append(**aux); - (*aux)++; + szExponent.append(**ppAux); + (*ppAux)++; } } - float value = data.toFloat(); - if(!exponent.isNull()) + float fValue = szData.toFloat(); + if(!szExponent.isNull()) { - value*=pow(10.0,exponent.toInt()); + fValue *= pow(10.0,szExponent.toInt()); } - return new KviKvsVariant(value); + return new KviKvsVariant(fValue); } -KviKvsVariant* KviKvsVariant::unserializeInteger(const QChar** aux,QString& data) +KviKvsVariant * KviKvsVariant::unserializeInteger(const QChar ** ppAux, QString & szData) { + QString szExponent; - QString exponent; - - if((*aux)->unicode() == 'e' || (*aux)->unicode() == 'E') + if((*ppAux)->unicode() == 'e' || (*ppAux)->unicode() == 'E') { - (*aux)++; - if((*aux)->unicode() == '-') + (*ppAux)++; + if((*ppAux)->unicode() == '-') { - exponent.append('-'); - (*aux)++; + szExponent.append('-'); + (*ppAux)++; } else { - if((*aux)->unicode() == '+') + if((*ppAux)->unicode() == '+') { - exponent.append('+'); - (*aux)++; + szExponent.append('+'); + (*ppAux)++; } } - while((*aux)->isDigit()) + while((*ppAux)->isDigit()) { - exponent.append(**aux); - (*aux)++; + szExponent.append(**ppAux); + (*ppAux)++; } } - kvs_int_t value = data.toInt(); - if(!exponent.isNull()) + kvs_int_t iValue = szData.toInt(); + if(!szExponent.isNull()) { - value*= (kvs_int_t) pow(10.0,exponent.toInt()); + iValue *= (kvs_int_t) pow(10.0,szExponent.toInt()); } - return new KviKvsVariant(value); + return new KviKvsVariant(iValue); } -KviKvsVariant* KviKvsVariant::unserializeString(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeString(const QChar ** ppAux) { - QString buffer; - unserializeString(aux,buffer); - return new KviKvsVariant(buffer); + QString szBuffer; + unserializeString(ppAux,szBuffer); + return new KviKvsVariant(szBuffer); } -void KviKvsVariant::unserializeString(const QChar** aux,QString& data) +void KviKvsVariant::unserializeString(const QChar ** ppAux, QString & szData) { - data=""; - QString hex; //temp var + szData = ""; + QString szHex; //temp var //skip leading " - (*aux)++; - while((*aux)->unicode()) + (*ppAux)++; + while((*ppAux)->unicode()) { - switch((*aux)->unicode()) + switch((*ppAux)->unicode()) { - case '"': - //EOF - (*aux)++; - return; + case '"': + //EOF + (*ppAux)++; + return; break; - case '\\': - //Special - (*aux)++; - switch((*aux)->unicode()) - { - case 't': - data.append('\t'); - break; - case '\"': - data.append('\"'); - break; - case '/': - data.append('/'); - break; - case 'b': - data.append('\b'); - break; - case 'f': - data.append('\f'); - break; - case 'n': - data.append('\n'); - break; - case 'r': - data.append('\r'); - break; - case 'u': - //4 hexadecmical digits pending... - hex=""; - (*aux)++; - for(int k=0;k<4 && (*aux)->unicode(); k++) + case '\\': + //Special + (*ppAux)++; + switch((*ppAux)->unicode()) { - if((*aux)->isDigit() || - ((*aux)->unicode() >='A' && (*aux)->unicode() <='F')|| //ABCDEF - ((*aux)->unicode() >='a' && (*aux)->unicode() <='f')) //abcdef - { - hex.append(**aux); - (*aux)++; - } else { - break; - } + case 't': + szData.append('\t'); + break; + case '\"': + szData.append('\"'); + break; + case '/': + szData.append('/'); + break; + case 'b': + szData.append('\b'); + break; + case 'f': + szData.append('\f'); + break; + case 'n': + szData.append('\n'); + break; + case 'r': + szData.append('\r'); + break; + case 'u': + //4 hexadecmical digits pending... + szHex = ""; + (*ppAux)++; + for(int i=0; i<4 && (*ppAux)->unicode(); i++) + { + if((*ppAux)->isDigit() || + ((*ppAux)->unicode() >='A' && (*ppAux)->unicode() <='F')|| //ABCDEF + ((*ppAux)->unicode() >='a' && (*ppAux)->unicode() <='f')) //abcdef + { + szHex.append(**ppAux); + (*ppAux)++; + } else { + break; + } + } + (*ppAux)--; + szData.append(QChar(szHex.toUInt(0,16))); + break; + default: + //Fallback; incorrect escape + (*ppAux)--; + szData.append('\\'); } - (*aux)--; - data.append(QChar(hex.toUInt(0,16))); - break; - default: - //Fallback; incorrect escape - (*aux)--; - data.append('\\'); - } - (*aux)++; + (*ppAux)++; break; - default: - data.append(**aux); - (*aux)++; + default: + szData.append(**ppAux); + (*ppAux)++; break; } } } -KviKvsVariant* KviKvsVariant::unserializeHash(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeHash(const QChar ** ppAux) { - KviKvsHash* pHash = new KviKvsHash(); + KviKvsHash * pHash = new KviKvsHash(); QString szKey; - KviKvsVariant* pElement = 0; + KviKvsVariant * pElement = 0; //skip leading '{' - (*aux)++; + (*ppAux)++; int i=0; while(1) { //skip leading space - while((*aux)->isSpace()) - (*aux)++; + while((*ppAux)->isSpace()) + (*ppAux)++; //waiting for starting of string - if((*aux)->unicode()!='\"') + if((*ppAux)->unicode() != '\"') { //strange characters delete pHash; return 0; } - unserializeString(aux,szKey); + unserializeString(ppAux,szKey); if(szKey.isEmpty()) { //Strange element name @@ -1224,40 +1674,39 @@ KviKvsVariant* KviKvsVariant::unserializeHash(const QChar** aux) } //skip leading space before ':' - while((*aux)->isSpace()) - (*aux)++; + while((*ppAux)->isSpace()) + (*ppAux)++; //waiting for name-value delimeter - if((*aux)->unicode()!=':') + if((*ppAux)->unicode() != ':') { //strange characters delete pHash; return 0; } - (*aux)++; - + (*ppAux)++; //getting element - pElement = unserialize(aux); + pElement = unserialize(ppAux); if(pElement) { pHash->set(szKey,pElement); i++; - while((*aux)->isSpace()) - (*aux)++; - switch((*aux)->unicode()) + while((*ppAux)->isSpace()) + (*ppAux)++; + switch((*ppAux)->unicode()) { - case ',': - //goto next - (*aux)++; + case ',': + //goto next + (*ppAux)++; break; - case '}': - //EOF array - (*aux)++; - return new KviKvsVariant(pHash); + case '}': + //EOF array + (*ppAux)++; + return new KviKvsVariant(pHash); break; - default: - delete pHash; - return 0; + default: + delete pHash; + return 0; break; } } else { @@ -1269,35 +1718,35 @@ KviKvsVariant* KviKvsVariant::unserializeHash(const QChar** aux) return 0; } -KviKvsVariant* KviKvsVariant::unserializeArray(const QChar** aux) +KviKvsVariant * KviKvsVariant::unserializeArray(const QChar ** ppAux) { - KviKvsArray* pArray = new KviKvsArray(); - KviKvsVariant* pElement = 0; - (*aux)++; + KviKvsArray * pArray = new KviKvsArray(); + KviKvsVariant * pElement = 0; + (*ppAux)++; int i=0; while(1) { - pElement = unserialize(aux); + pElement = unserialize(ppAux); if(pElement) { pArray->set(i,pElement); i++; - while((*aux)->isSpace()) - (*aux)++; - switch((*aux)->unicode()) + while((*ppAux)->isSpace()) + (*ppAux)++; + switch((*ppAux)->unicode()) { - case ',': - //goto next - (*aux)++; + case ',': + //goto next + (*ppAux)++; break; - case ']': - //EOF array - (*aux)++; - return new KviKvsVariant(pArray); + case ']': + //EOF array + (*ppAux)++; + return new KviKvsVariant(pArray); break; - default: - delete pArray; - return 0; + default: + delete pArray; + return 0; break; } } else { @@ -1308,317 +1757,3 @@ KviKvsVariant* KviKvsVariant::unserializeArray(const QChar** aux) } return 0; } - -KviKvsVariant* KviKvsVariant::unserialize(const QChar** aux) -{ - KviKvsVariant* pResult = 0; - - while((*aux)->isSpace()) - (*aux)++; - - switch((*aux)->unicode()) - { - case 't': - //true - pResult = unserializeTrue(aux); - break; - case 'f': - //false - pResult = unserializeFalse(aux); - break; - case 'n': - //null - pResult = unserializeNull(aux); - break; - case '[': - //array - pResult = unserializeArray(aux); - break; - case '{': - //hash - pResult = unserializeHash(aux); - break; - case '"': - //string - pResult = unserializeString(aux); - break; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': - case '0': - case '-': - //real or integer - pResult = unserializeRealOrInteger(aux); - break; - default: - //incorrect value - return 0; - } - - while((*aux)->isSpace()) - (*aux)++; - - return pResult; -} - -KviKvsVariant* KviKvsVariant::unserialize(const QString& data) -{ - KviKvsVariant* pResult = 0; - - const QChar * aux = (const QChar *)data.constData(); - - pResult = unserialize(&aux); - - if(aux->unicode()) - { - //strange extra characters? - if(pResult) delete pResult; - pResult = 0; - } - - return pResult; -} - -int KviKvsVariant::compare(const KviKvsVariant * pOther,bool bPreferNumeric) const -{ - // returns -1 if this variant is greater than pOther - // 0 if they are considered to be equal - // 1 if the other variant is greater - - if(!pOther) - return isEqualToNothing() ? CMP_EQUAL : CMP_THISGREATER; - if(!pOther->m_pData) - return isEqualToNothing() ? CMP_EQUAL : CMP_THISGREATER; - if(!m_pData) - return pOther->isEqualToNothing() ? CMP_EQUAL : CMP_OTHERGREATER; - - switch(m_pData->m_eType) - { - case KviKvsVariantData::HObject: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::HObject: - if(m_pData->m_u.hObject == pOther->m_pData->m_u.hObject)return CMP_EQUAL; - if(m_pData->m_u.hObject == ((kvs_hobject_t)0))return CMP_OTHERGREATER; - return CMP_THISGREATER; - break; - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_hobject(pOther,this); - break; - case KviKvsVariantData::Real: - return -1 * KviKvsVariantComparison::compare_real_hobject(pOther,this); - break; - case KviKvsVariantData::String: - return -1 * KviKvsVariantComparison::compare_string_hobject(pOther,this); - break; - case KviKvsVariantData::Boolean: - return -1 * KviKvsVariantComparison::compare_boolean_hobject(pOther,this); - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_hobject_hash(this,pOther); - break; - case KviKvsVariantData::Array: - return KviKvsVariantComparison::compare_hobject_array(this,pOther); - break; - default: // just make gcc happy - break; - } - break; - case KviKvsVariantData::Integer: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::HObject: - return KviKvsVariantComparison::compare_integer_hobject(this,pOther); - break; - case KviKvsVariantData::Integer: - if(m_pData->m_u.iInteger == pOther->m_pData->m_u.iInteger)return CMP_EQUAL; - if(m_pData->m_u.iInteger > pOther->m_pData->m_u.iInteger)return CMP_THISGREATER; - return CMP_OTHERGREATER; - break; - case KviKvsVariantData::Real: - return KviKvsVariantComparison::compare_integer_real(this,pOther); - break; - case KviKvsVariantData::String: - return KviKvsVariantComparison::compare_integer_string(this,pOther); - break; - case KviKvsVariantData::Boolean: - return KviKvsVariantComparison::compare_integer_boolean(this,pOther); - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_integer_hash(this,pOther); - break; - case KviKvsVariantData::Array: - return KviKvsVariantComparison::compare_integer_array(this,pOther); - break; - default: // just make gcc happy - break; - } - break; - case KviKvsVariantData::Real: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::HObject: - return KviKvsVariantComparison::compare_real_hobject(this,pOther); - break; - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_real(pOther,this); - break; - case KviKvsVariantData::Real: - if(*(m_pData->m_u.pReal) == *(pOther->m_pData->m_u.pReal))return CMP_EQUAL; - if(*(m_pData->m_u.pReal) > *(pOther->m_pData->m_u.pReal))return CMP_THISGREATER; - return CMP_OTHERGREATER; - break; - case KviKvsVariantData::String: - return KviKvsVariantComparison::compare_real_string(this,pOther); - break; - case KviKvsVariantData::Boolean: - return KviKvsVariantComparison::compare_real_boolean(this,pOther); - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_real_hash(this,pOther); - break; - case KviKvsVariantData::Array: - return KviKvsVariantComparison::compare_real_array(this,pOther); - break; - default: // just make gcc happy - break; - } - break; - case KviKvsVariantData::String: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::String: - if(bPreferNumeric) - { - // prefer numeric comparison - double dReal1; - double dReal2; - if(asReal(dReal1)) - { - if(pOther->asReal(dReal2)) - { - if(dReal1 == dReal2)return CMP_EQUAL; - if(dReal1 > dReal2)return CMP_THISGREATER; - return CMP_OTHERGREATER; - } - } - } - return -1 * KviQString::cmpCI(*(m_pData->m_u.pString),*(pOther->m_pData->m_u.pString)); - case KviKvsVariantData::Real: - return -1 * KviKvsVariantComparison::compare_real_string(pOther,this); - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_string(pOther,this); - case KviKvsVariantData::Boolean: - return -1 * KviKvsVariantComparison::compare_boolean_string(pOther,this); - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_string_hash(this,pOther); - break; - case KviKvsVariantData::Array: - return KviKvsVariantComparison::compare_string_array(this,pOther); - break; - case KviKvsVariantData::HObject: - return KviKvsVariantComparison::compare_string_hobject(this,pOther); - break; - default: - break; - } - break; - case KviKvsVariantData::Hash: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::String: - return -1 * KviKvsVariantComparison::compare_string_hash(pOther,this); - case KviKvsVariantData::Real: - return -1 * KviKvsVariantComparison::compare_real_hash(pOther,this); - break; - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_hash(pOther,this); - break; - case KviKvsVariantData::Boolean: - return -1 * KviKvsVariantComparison::compare_boolean_hash(pOther,this); - break; - case KviKvsVariantData::Hash: - if(m_pData->m_u.pHash->size() > pOther->m_pData->m_u.pHash->size())return CMP_THISGREATER; - if(m_pData->m_u.pHash->size() == pOther->m_pData->m_u.pHash->size())return CMP_EQUAL; - return CMP_OTHERGREATER; - break; - case KviKvsVariantData::Array: - return -1 * KviKvsVariantComparison::compare_array_hash(pOther,this); - break; - case KviKvsVariantData::HObject: - return -1 * KviKvsVariantComparison::compare_hobject_hash(pOther,this); - break; - default: - break; - } - break; - case KviKvsVariantData::Array: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::String: - return -1 * KviKvsVariantComparison::compare_string_array(pOther,this); - case KviKvsVariantData::Real: - return -1 * KviKvsVariantComparison::compare_real_array(pOther,this); - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_array(pOther,this); - case KviKvsVariantData::Boolean: - return -1 * KviKvsVariantComparison::compare_boolean_array(pOther,this); - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_array_hash(this,pOther); - break; - case KviKvsVariantData::Array: - if(m_pData->m_u.pArray->size() > pOther->m_pData->m_u.pArray->size())return CMP_THISGREATER; - if(m_pData->m_u.pArray->size() == pOther->m_pData->m_u.pArray->size())return CMP_EQUAL; - return CMP_OTHERGREATER; - break; - case KviKvsVariantData::HObject: - return -1 * KviKvsVariantComparison::compare_hobject_array(pOther,this); - break; - default: - break; - } - break; - case KviKvsVariantData::Boolean: - switch(pOther->m_pData->m_eType) - { - case KviKvsVariantData::String: - return KviKvsVariantComparison::compare_boolean_string(this,pOther); - break; - case KviKvsVariantData::Real: - return -1 * KviKvsVariantComparison::compare_real_boolean(pOther,this); - break; - case KviKvsVariantData::Integer: - return -1 * KviKvsVariantComparison::compare_integer_boolean(pOther,this); - break; - case KviKvsVariantData::Boolean: - if(m_pData->m_u.bBoolean == pOther->m_pData->m_u.bBoolean)return CMP_EQUAL; - if(m_pData->m_u.bBoolean)return CMP_THISGREATER; - return CMP_OTHERGREATER; - break; - case KviKvsVariantData::Hash: - return KviKvsVariantComparison::compare_boolean_hash(this,pOther); - break; - case KviKvsVariantData::Array: - return KviKvsVariantComparison::compare_boolean_array(this,pOther); - break; - case KviKvsVariantData::HObject: - return KviKvsVariantComparison::compare_boolean_hobject(this,pOther); - break; - default: - break; - } - break; - default: // should never happen anyway - break; - } - - return CMP_THISGREATER; // should never happen -}
\ No newline at end of file diff --git a/src/kvirc/kvs/kvi_kvs_variant.h b/src/kvirc/kvs/kvi_kvs_variant.h index e82851266..47bf5b7d7 100644 --- a/src/kvirc/kvs/kvi_kvs_variant.h +++ b/src/kvirc/kvs/kvi_kvs_variant.h @@ -6,7 +6,7 @@ // Creation date : Tue 07 Oct 2003 04:01:19 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution -// Copyright (C) 2003-2008 Szymon Stefanek <pragma at kvirc dot net> +// Copyright (C) 2003-2010 Szymon Stefanek <pragma at kvirc dot net> // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -24,184 +24,851 @@ // //============================================================================= +/** +* \file kvi_kvs_variant.h +* \author Szymon Stefanek +* \brief Handling of variant data +*/ + #include "kvi_settings.h" #include "kvi_qstring.h" #include "kvi_heapobject.h" #include "kvi_kvs_types.h" - class KviKvsVariant; class KviKvsArrayCast; +// pre-declare.. the real declarations are included below +class KviKvsHash; +class KviKvsArray; + +/** +* \class KviKvsNumber +* \brief A class which maps every number +*/ class KVIRC_API KviKvsNumber { friend class KviKvsVariant; public: - enum DataType { Real, Integer }; + /** + * \enum Type + * \brief Describes the type of number + */ + enum Type { + Real, /**< The number is an integer */ + Integer /**< The number is a double floating point */ + }; protected: - union { - kvs_int_t iInteger; + /** + * \union DataType + * \brief This union holds an integer or a double floating point number + */ + union DataType { + kvs_int_t iInt; kvs_real_t dReal; - } m_u; - DataType m_type; + }; +protected: + Type m_type; + DataType m_u; public: - DataType type() const { return m_type; }; + /** + * \brief Returns the type of the number + * \return Type + */ + Type type() const { return m_type; }; + + /** + * \brief Returns true if the number is a double floating point + * \return bool + */ bool isReal() const { return m_type == Real; }; + + /** + * \brief Returns true if the number is an integer + * \return bool + */ bool isInteger() const { return m_type == Integer; }; + + /** + * \brief Return the real number if the number itself is a double floating point + * \return kvs_real_t + */ kvs_real_t real() const { return m_u.dReal; }; - kvs_int_t integer() const { return m_u.iInteger; }; -}; -// pre-declare.. the real declarations are included below -class KviKvsHash; -class KviKvsArray; + /** + * \brief Return the integer number if the number itself is an integer + * \return kvs_int_t + */ + kvs_int_t integer() const { return m_u.iInt; }; +}; +/** +* \class KviKvsVariantData +* \brief The class which holds the type of the variant data +*/ class KviKvsVariantData { public: + /** + * \enum Type + * \brief Holds the type of the variant data + */ enum Type { - Nothing = 0, // m_pData not initialized - String = 1, // QString (scalar) - Integer = 2, // long int (scalar) - Real = 4, // double (scalar) - Array = 8, // KviKvsArray - Hash = 16, // KviKvsHash - Boolean = 32, // bool (scalar) - HObject = 64 // object, shallow! (scalar) + Nothing = 0, /**< Data not initialized */ + String = 1, /**< QString (scalar) */ + Integer = 2, /**< long int (scalar) */ + Real = 4, /**< double (scalar) */ + Array = 8, /**< KviKvsArray */ + Hash = 16, /**< KviKvsHash */ + Boolean = 32, /**< bool (scalar) */ + HObject = 64 /**< object, shallow! (scalar) */ }; public: - unsigned int m_uRefs; - Type m_eType; - union { - kvs_int_t iInteger; + /** + * \union DataType + * \brief Holds the value of the variant data + */ + union DataType { + kvs_int_t iInt; kvs_real_t * pReal; QString * pString; KviKvsArray * pArray; KviKvsHash * pHash; bool bBoolean; kvs_hobject_t hObject; - } m_u; + }; +public: + unsigned int m_uRefs; + Type m_eType; + DataType m_u; }; -// This class must not have virtual funcitons nor destructor -// Otherwise it will happily crash on windows when it is -// allocated in modules and destroyed anywhere else around... +/** +* \class KviKvsVariantComparison +* \brief A class for comparison between two variant data +*/ +class KviKvsVariantComparison +{ +public: + /** + * \enum Result + * \brief Holds the result of the comparison + */ + enum Result { + FirstGreater = -1, /**< the first variant is greater than the second */ + Equal = 0, /**< the two variants are equal */ + SecondGreater = 1 /**< the second variant is greater than the first */ + }; +public: + /** + * \brief Compares an integer and a string variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntString(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an integer and a double floating point variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntReal(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an integer and a boolean variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntBool(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an integer and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an integer and an array variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an integer and an object handle variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareIntHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a double floating point and an object handle variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareRealHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a double floating point and a string variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareRealString(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a double floating point and a boolean variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareRealBool(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a double floating point and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareRealHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a double floating point and an array variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareRealArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a string and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareStringHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a string and an array variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareStringArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a string and an object handle variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareStringHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a boolean and a string variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareBoolString(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a boolean and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareBoolHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a boolean and an array variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareBoolArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares a boolean and an object handle variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareBoolHObject(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an array and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareArrayHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an object handle and a hash variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareHObjectHash(const KviKvsVariant * pV1, const KviKvsVariant * pV2); + + /** + * \brief Compares an object handle and an array variant + * \param pV1 The first variant to compare + * \param pV2 The second variant to compare + * \return int + */ + static inline int compareHObjectArray(const KviKvsVariant * pV1, const KviKvsVariant * pV2); +}; + +/** +* \class KviKvsVariant +* \brief This class holds the variant data +* +* A variant data is a data which can assume different data types. This is very useful when you +* don't know in advance which data type you have to manage. +* \warning This class must NOT have virtual functions nor destructor otherwise it will happily +* crash on windows when it is allocated in modules and destroyed anywhere else around... +*/ class KVIRC_API KviKvsVariant : public KviHeapObject { friend class KviKvsVariantComparison; public: + /** + * \brief Constructs the variant data + * \return KviKvsVariant + */ KviKvsVariant(); - KviKvsVariant(kvs_int_t iInteger, bool bEscape=false); + + /** + * \brief Constructs the variant data + * + * This is a carbon copy + * \param variant The variant data to use as a copy + * \return KviKvsVariant + */ + KviKvsVariant(const KviKvsVariant & variant); + + /** + * \brief Constructs the variant data + * \param szString The string data to use as variant data + * \param bEscape Whether to escape the data in KVS + * \return KviKvsVariant + */ + KviKvsVariant(const QString & szString, bool bEscape = false); + + /** + * \brief Constructs the variant data + * \param pcString The string data to use as variant data + * \param bEscape Whether to escape the data in KVS + * \warning Without this constructor gcc chooses the conversion (const char *)->(void *) + * instead of (const char *)->(QString) and obviously calls the wrong constructor + * \return KviKvsVariant + */ + KviKvsVariant(const char * pcString, bool bEscape=false); + + /** + * \brief Constructs the variant data + * \param pszString The string data to use as variant data + * \param bEscape Whether to escape the data in KVS + * \return KviKvsVariant + */ + KviKvsVariant(QString * pszString, bool bEscape = false); + + /** + * \brief Constructs the variant data + * \param iInteger The integer data to use as variant data + * \param bEscape Whether to escape the data in KVS + * \return KviKvsVariant + */ + KviKvsVariant(kvs_int_t iInteger, bool bEscape = false); + + /** + * \brief Constructs the variant data + * \param dReal The double floating point data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(kvs_real_t dReal); + + /** + * \brief Constructs the variant data + * \param pReal The double floating point data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(kvs_real_t * pReal); + + /** + * \brief Constructs the variant data + * \param bBoolean The boolean data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(bool bBoolean); - KviKvsVariant(const QString &szString, bool bEscape=false); - KviKvsVariant(const char * szString, bool bEscape=false); // without this gcc chooses the conversion (const char *)->(void *) instead of (const char *)->(QString) and obviously calls the wrong constructor - KviKvsVariant(QString * pString, bool bEscape=false); + + /** + * \brief Constructs the variant data + * \param pArray The array data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(KviKvsArray * pArray); + + /** + * \brief Constructs the variant data + * \param pHash The hash data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(KviKvsHash * pHash); + + /** + * \brief Constructs the variant data + * \param hObject The hObject data to use as variant data + * \return KviKvsVariant + */ KviKvsVariant(kvs_hobject_t hObject); - KviKvsVariant(const KviKvsVariant &v); + + /** + * \brief Destroys the variant data + */ ~KviKvsVariant(); protected: KviKvsVariantData * m_pData; public: + /** + * \brief Returns the type of the variant data + * \return KviKvsVariantData::Type + */ KviKvsVariantData::Type type(){ return m_pData ? m_pData->m_eType : KviKvsVariantData::Nothing; }; + /** + * \brief Sets the variant data as double floating point + * \param dReal The value to set + * \return void + */ void setReal(kvs_real_t dReal); + + /** + * \brief Sets the variant data as double floating point + * \param pReal The value to set + * \return void + */ void setReal(kvs_real_t * pReal); + + /** + * \brief Sets the variant data as integer + * \param iInteger The value to set + * \return void + */ void setInteger(kvs_int_t iInteger); - void setString(const QString &szString); - void setString(QString * pString); + + /** + * \brief Sets the variant data as string + * \param szString The value to set + * \return void + */ + void setString(const QString & szString); + + /** + * \brief Sets the variant data as string + * \param pszString The value to set + * \return void + */ + void setString(QString * pszString); + + /** + * \brief Sets the variant data as array + * \param pArray The value to set + * \return void + */ void setArray(KviKvsArray * pArray); + + /** + * \brief Sets the variant data as hash + * \param pHash The value to set + * \return void + */ void setHash(KviKvsHash * pHash); + + /** + * \brief Sets the variant data as boolean + * \param bBoolean The value to set + * \return void + */ void setBoolean(bool bBoolean); + + /** + * \brief Sets the variant data as hObject + * \param hObject The value to set + * \return void + */ void setHObject(kvs_hobject_t hObject); + + /** + * \brief Clears the variant data + * \return void + */ void setNothing(); - //void unset(){ setNothing(); }; - void getTypeName(QString &szBuffer) const; + /** + * \brief Gets the type from a variant and returns its name + * \param szBuffer The buffer to save the type name + * \return void + */ + void getTypeName(QString & szBuffer) const; + /** + * \brief Returns true if the variant is empty + * \return bool + */ bool isNothing() const { return !m_pData; }; + + /** + * \brief Returns true if the variant is an integer + * \return bool + */ bool isInteger() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Integer) : false; }; + + /** + * \brief Returns true if the variant is a double floating point + * \return bool + */ bool isReal() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Real) : false; }; + + /** + * \brief Returns true if the variant is numeric + * \return bool + */ bool isNumeric() const { return m_pData ? (m_pData->m_eType & (KviKvsVariantData::Integer | KviKvsVariantData::Real)) : false; }; + + /** + * \brief Returns true if the variant is a string + * \return bool + */ bool isString() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::String) : false; }; + + /** + * \brief Returns true if the variant is a scalar + * \return bool + */ bool isScalar() const { return m_pData ? (m_pData->m_eType & (KviKvsVariantData::String | KviKvsVariantData::Integer | KviKvsVariantData::Real)) : false; }; + + /** + * \brief Returns true if the variant is an array + * \return bool + */ bool isArray() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Array) : false; }; + + /** + * \brief Returns true if the variant is an hash + * \return bool + */ bool isHash() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Hash) : false; }; + + /** + * \brief Returns true if the variant is boolean + * \return bool + */ bool isBoolean() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::Boolean) : false; }; + + /** + * \brief Returns true if the variant is a hObject + * \return bool + */ bool isHObject() const { return m_pData ? (m_pData->m_eType == KviKvsVariantData::HObject) : false; }; + /** + * \brief Returns true if the variant is empty + * \return bool + */ bool isEmpty() const; - // returns true if this variant is nothing, false, null, 0 or an empty string + /** + * \brief Returns true if the variant is nothing, false, null, 0 or an empty string + * \return bool + */ bool isEqualToNothing() const; - // evaluates Integer, Real and String rappresenting an Integer - bool asInteger(kvs_int_t &iVal) const; - // evaluates Real, Integer and String rappresenting a Real - bool asReal(kvs_real_t &dVal) const; - // evaluates Real, Integer and String rappresenting a Real or integer - bool asNumber(KviKvsNumber &n) const; - // always evaluates to a boolean value + /** + * \brief Eevaluates Integer, Real and String rappresenting an Integer + * \param iVal The integer buffer to save + * \return bool + */ + bool asInteger(kvs_int_t & iVal) const; + + /** + * \brief Eevaluates Integer, Real and String rappresenting a Real + * \param dVal The double floating point buffer to save + * \return bool + */ + bool asReal(kvs_real_t & dVal) const; + + /** + * \brief Eevaluates Integer, Real and String rappresenting a Real or Integer + * \param n The number buffer to save + * \return bool + */ + bool asNumber(KviKvsNumber & n) const; + + /** + * \brief Always evaluates to a boolean value + * \return bool + */ bool asBoolean() const; - // evaluates to an object handle - bool asHObject(kvs_hobject_t &hObject) const; - // evaluates anything to a string - void asString(QString &szBuffer) const; - void appendAsString(QString &szBuffer) const; - // always evaluates to some number... - void castToNumber(KviKvsNumber &n) const; - // always evaluates to an integer - void castToInteger(kvs_int_t &iVal) const; - // always evaluates to an array - void castToArray(KviKvsArrayCast *c) const; - // converts this variant to an array + /** + * \brief Evaluates to an object handle + * \param hObject The hObject buffer to save + * \return bool + */ + bool asHObject(kvs_hobject_t & hObject) const; + + /** + * \brief Evaluates anything to a string + * \param szBuffer The string buffer to save + * \return bool + */ + void asString(QString & szBuffer) const; + + /** + * \brief Appends the variant data to a representative string + * \param szBuffer The string buffer to save + * \return void + */ + void appendAsString(QString & szBuffer) const; + + /** + * \brief Casts the variant data to a number + * + * Always evaluates to some number + * \param number The string buffer to save + * \return void + */ + void castToNumber(KviKvsNumber & number) const; + + /** + * \brief Casts the variant data to an integer + * + * Always evaluates to an integer + * \param iVal The integer buffer to save + * \return void + */ + void castToInteger(kvs_int_t & iVal) const; + + /** + * \brief Casts the variant data to an array + * + * Always evaluates to an array + * \param pCast The array buffer to save + * \return void + */ + void castToArray(KviKvsArrayCast * pCast) const; + + /** + * \brief Converts this variant to an array + * \return void + */ void convertToArray(); - kvs_int_t integer() const { return m_pData ? m_pData->m_u.iInteger : 0; }; + /** + * \brief Returns the integer contained in the variant data + * \return kvs_int_t + */ + kvs_int_t integer() const { return m_pData ? m_pData->m_u.iInt : 0; }; + + /** + * \brief Returns the double floating point contained in the variant data + * \return kvs_real_t + */ kvs_real_t real() const { return m_pData ? *(m_pData->m_u.pReal) : 0.0; }; + + /** + * \brief Returns the string contained in the variant data + * \return const QString & + */ const QString & string() const { return m_pData ? *(m_pData->m_u.pString) : KviQString::Empty; }; + + /** + * \brief Returns the boolean contained in the variant data + * \return bool + */ + bool boolean() const { return m_pData ? m_pData->m_u.bBoolean : false; }; + + /** + * \brief Returns the array contained in the variant data + * \return KviKvsArray + */ KviKvsArray * array() const { return m_pData ? m_pData->m_u.pArray : 0; }; + + /** + * \brief Returns the hash contained in the variant data + * \return KviKvsHash + */ KviKvsHash * hash() const { return m_pData ? m_pData->m_u.pHash : 0; }; - bool boolean() const { return m_pData ? m_pData->m_u.bBoolean : false; }; + + /** + * \brief Returns the object handle contained in the variant data + * \return kvs_hobject_t + */ kvs_hobject_t hobject() const { return m_pData ? m_pData->m_u.hObject : (kvs_hobject_t)0; }; - void copyFrom(const KviKvsVariant * v); - void copyFrom(const KviKvsVariant & v); - void takeFrom(KviKvsVariant * v); - void takeFrom(KviKvsVariant &v); + /** + * \brief Copies a variant from another + * \param pVariant The variant to copy from + * \return void + */ + void copyFrom(const KviKvsVariant * pVariant); + + /** + * \brief Copies a variant from another + * \param variant The variant to copy from + * \return void + */ + void copyFrom(const KviKvsVariant & variant); - void dump(const char * prefix) const; + /** + * \brief Copies a variant from another and destroys the second one + * \param pVariant The variant to take from + * \return void + */ + void takeFrom(KviKvsVariant * pVariant); - // returns -1 if this variant is greater than the other, 0 if are equal, 1 if the other is greater - // if bPreferNumeric is true then when comparing strings a conversion to a numeric format - // is first attempted. - int compare(const KviKvsVariant * pOther,bool bPreferNumeric = false) const; + /** + * \brief Copies a variant from another and destroys the second one + * \param variant The variant to take from + * \return void + */ + void takeFrom(KviKvsVariant & variant); - void operator = (const KviKvsVariant &v){ copyFrom(v); }; + /** + * \brief Dumps the variant data + * \param pcPrefix The prefix of the data + * \return void + */ + void dump(const char * pcPrefix) const; - //JSON serialization - void serialize(QString& result); - static void serializeString(QString& buffer); - static KviKvsVariant* unserialize(const QString& buffer); + /** + * \brief Compares two variants + * + * Returns -1 if this variant is greater than the other, 0 if they are equal, 1 if the + * other is greater. + * If bPreferNumeric is true then a conversion to a numeric format is first attempted + * \param pOther The second variant to compare + * \param bPreferNumeric Whether to cast to a numeric format + * \return int + */ + int compare(const KviKvsVariant * pOther, bool bPreferNumeric = false) const; + + // JSON serialization + /** + * \brief Serializes the variant data using the JSON format + * \param szResult The buffer to store the serialization + * \return void + */ + void serialize(QString & szResult); + + /** + * \brief Replaces escapes chars and serialize the string in the given buffer + * \param szBuffer The buffer to store the serialization + * \return void + */ + static void serializeString(QString & szBuffer); + + /** + * \brief Unserializes the variant data using the JSON format + * \param szBuffer The buffer where is stored the serialization + * \return KviKvsVariant * + */ + static KviKvsVariant * unserialize(const QString & szBuffer); + + /** + * \brief Allows to create a variant using a carbon copy method + * \param variant The variant to copy from + * \return void + */ + void operator = (const KviKvsVariant & variant){ copyFrom(variant); }; private: - static KviKvsVariant* unserialize(const QChar** aux); - static KviKvsVariant* unserializeTrue(const QChar** aux); - static KviKvsVariant* unserializeFalse(const QChar** aux); - static KviKvsVariant* unserializeNull(const QChar** aux); - static KviKvsVariant* unserializeArray(const QChar** aux); - static KviKvsVariant* unserializeHash(const QChar** aux); - static void unserializeString(const QChar** aux,QString& buffer); - static KviKvsVariant* unserializeString(const QChar** aux); - static KviKvsVariant* unserializeRealOrInteger(const QChar** aux); - static KviKvsVariant* unserializeReal(const QChar** aux,QString& data); - static KviKvsVariant* unserializeInteger(const QChar** aux,QString& data); + /** + * \brief Unserializes the variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserialize(const QChar ** ppAux); + + /** + * \brief Unserializes a boolean into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \param bBool Whether the variant is true or false + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeBool(const QChar ** ppAux, bool bBool); + + /** + * \brief Unserializes null into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeNull(const QChar ** ppAux); + + /** + * \brief Unserializes an array into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeArray(const QChar ** ppAux); + + /** + * \brief Unserializes a hash into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeHash(const QChar ** ppAux); + + /** + * \brief Unserializes a string into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \param szBuffer The buffer to store the unserialization + * \return void + */ + static void unserializeString(const QChar ** ppAux, QString & szBuffer); + + /** + * \brief Unserializes a string into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeString(const QChar ** ppAux); + + /** + * \brief Unserializes a number into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeNumber(const QChar ** ppAux); + + /** + * \brief Unserializes a double floating point into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \param szData The buffer where the serialization is stored + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeReal(const QChar ** ppAux, QString & szData); + + /** + * \brief Unserializes an integer into a variant data using the JSON format + * \param ppAux The pointer where the serialization is located + * \param szData The buffer where the serialization is stored + * \return KviKvsVariant * + */ + static KviKvsVariant * unserializeInteger(const QChar ** ppAux, QString & szData); }; #include "kvi_kvs_array.h" #include "kvi_kvs_hash.h" -#endif //!_KVI_KVS_VARIANT_H_ +#endif // _KVI_KVS_VARIANT_H_ diff --git a/src/kvirc/kvs/kvi_kvs_variantlist.cpp b/src/kvirc/kvs/kvi_kvs_variantlist.cpp index 0671923bb..ee2db9ca0 100644 --- a/src/kvirc/kvs/kvi_kvs_variantlist.cpp +++ b/src/kvirc/kvs/kvi_kvs_variantlist.cpp @@ -22,8 +22,6 @@ // //============================================================================= - - #include "kvi_kvs_variantlist.h" KviKvsVariantList::KviKvsVariantList() @@ -32,131 +30,144 @@ KviKvsVariantList::KviKvsVariantList() m_pList->setAutoDelete(true); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1) +{ + m_pList = new KviPointerList<KviKvsVariant>(); + m_pList->setAutoDelete(true); + m_pList->append(pV1); +} + +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); + m_pList->append(pV1); + m_pList->append(pV2); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); + m_pList->append(pV1); + m_pList->append(pV2); + m_pList->append(pV3); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); - m_pList->append(v3); + m_pList->append(pV1); + m_pList->append(pV2); + m_pList->append(pV3); + m_pList->append(pV4); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); - m_pList->append(v3); - m_pList->append(v4); + m_pList->append(pV1); + m_pList->append(pV2); + m_pList->append(pV3); + m_pList->append(pV4); + m_pList->append(pV5); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5, KviKvsVariant * pV6) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); - m_pList->append(v3); - m_pList->append(v4); - m_pList->append(v5); + m_pList->append(pV1); + m_pList->append(pV2); + m_pList->append(pV3); + m_pList->append(pV4); + m_pList->append(pV5); + m_pList->append(pV6); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5,KviKvsVariant * v6) +KviKvsVariantList::KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5, KviKvsVariant * pV6, KviKvsVariant * pV7) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); - m_pList->append(v3); - m_pList->append(v4); - m_pList->append(v5); - m_pList->append(v6); + m_pList->append(pV1); + m_pList->append(pV2); + m_pList->append(pV3); + m_pList->append(pV4); + m_pList->append(pV5); + m_pList->append(pV6); + m_pList->append(pV7); } -KviKvsVariantList::KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5,KviKvsVariant * v6,KviKvsVariant * v7) +KviKvsVariantList::KviKvsVariantList(QString * pS1) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(v1); - m_pList->append(v2); - m_pList->append(v3); - m_pList->append(v4); - m_pList->append(v5); - m_pList->append(v6); - m_pList->append(v7); + m_pList->append(new KviKvsVariant(pS1)); } -KviKvsVariantList::KviKvsVariantList(QString * s1) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); } -KviKvsVariantList::KviKvsVariantList(QString * s1,QString * s2) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); - m_pList->append(new KviKvsVariant(s2)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); + m_pList->append(new KviKvsVariant(pS3)); } -KviKvsVariantList::KviKvsVariantList(QString * s1,QString * s2,QString * s3) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); - m_pList->append(new KviKvsVariant(s2)); - m_pList->append(new KviKvsVariant(s3)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); + m_pList->append(new KviKvsVariant(pS3)); + m_pList->append(new KviKvsVariant(pS4)); } -KviKvsVariantList::KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); - m_pList->append(new KviKvsVariant(s2)); - m_pList->append(new KviKvsVariant(s3)); - m_pList->append(new KviKvsVariant(s4)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); + m_pList->append(new KviKvsVariant(pS3)); + m_pList->append(new KviKvsVariant(pS4)); + m_pList->append(new KviKvsVariant(pS5)); } -KviKvsVariantList::KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4,QString * s5) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5, QString * pS6) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); - m_pList->append(new KviKvsVariant(s2)); - m_pList->append(new KviKvsVariant(s3)); - m_pList->append(new KviKvsVariant(s4)); - m_pList->append(new KviKvsVariant(s5)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); + m_pList->append(new KviKvsVariant(pS3)); + m_pList->append(new KviKvsVariant(pS4)); + m_pList->append(new KviKvsVariant(pS5)); + m_pList->append(new KviKvsVariant(pS6)); } -KviKvsVariantList::KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4,QString * s5,QString * s6) +KviKvsVariantList::KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5, QString * pS6, QString * pS7) { m_pList = new KviPointerList<KviKvsVariant>(); m_pList->setAutoDelete(true); - m_pList->append(new KviKvsVariant(s1)); - m_pList->append(new KviKvsVariant(s2)); - m_pList->append(new KviKvsVariant(s3)); - m_pList->append(new KviKvsVariant(s4)); - m_pList->append(new KviKvsVariant(s5)); - m_pList->append(new KviKvsVariant(s6)); + m_pList->append(new KviKvsVariant(pS1)); + m_pList->append(new KviKvsVariant(pS2)); + m_pList->append(new KviKvsVariant(pS3)); + m_pList->append(new KviKvsVariant(pS4)); + m_pList->append(new KviKvsVariant(pS5)); + m_pList->append(new KviKvsVariant(pS6)); + m_pList->append(new KviKvsVariant(pS7)); } KviKvsVariantList::~KviKvsVariantList() @@ -170,30 +181,34 @@ void KviKvsVariantList::setAutoDelete(bool bAutoDelete) m_pList->setAutoDelete(bAutoDelete); } -void KviKvsVariantList::allAsString(QString &szBuffer) +void KviKvsVariantList::allAsString(QString & szBuffer) { szBuffer = QString(); bool bFirst = true; - for(KviKvsVariant * v = first();v;v = next()) + for(KviKvsVariant * v = first(); v; v = next()) { - if(bFirst)bFirst = false; - else szBuffer.append(' '); + if(bFirst) + bFirst = false; + else + szBuffer.append(' '); v->appendAsString(szBuffer); } } -bool KviKvsVariantList::firstAsString(QString &szBuffer) +bool KviKvsVariantList::firstAsString(QString & szBuffer) { KviKvsVariant * v = first(); - if(!v)return false; + if(!v) + return false; v->asString(szBuffer); return true; } -bool KviKvsVariantList::nextAsString(QString &szBuffer) +bool KviKvsVariantList::nextAsString(QString & szBuffer) { KviKvsVariant * v = next(); - if(!v)return false; + if(!v) + return false; v->asString(szBuffer); return true; } diff --git a/src/kvirc/kvs/kvi_kvs_variantlist.h b/src/kvirc/kvs/kvi_kvs_variantlist.h index 26510c513..16df64a3d 100644 --- a/src/kvirc/kvs/kvi_kvs_variantlist.h +++ b/src/kvirc/kvs/kvi_kvs_variantlist.h @@ -6,7 +6,7 @@ // Creation date : Sat 11 Oct 2003 02:20:51 by Szymon Stefanek // // This file is part of the KVIrc IRC client distribution -// Copyright (C) 2003-2008 Szymon Stefanek <pragma at kvirc dot net> +// Copyright (C) 2003-2010 Szymon Stefanek <pragma at kvirc dot net> // // This program is FREE software. You can redistribute it and/or // modify it under the terms of the GNU General Public License @@ -24,58 +24,298 @@ // //============================================================================= +/** +* \file kvi_kvs_variantlist.h +* \author Szymon Stefanek +* \brief Parser class to handle variant variables lists +*/ + #include "kvi_settings.h" #include "kvi_pointerlist.h" #include "kvi_kvs_variant.h" - - +/** +* \class KviKvsVariantList +* \brief Class to handle variant variables lists +*/ class KVIRC_API KviKvsVariantList { public: + /** + * \brief Constructs the KviKvsVariantList object + * \return KviKvsVariantList + */ KviKvsVariantList(); - KviKvsVariantList(KviKvsVariant * v1); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5,KviKvsVariant * v6); - KviKvsVariantList(KviKvsVariant * v1,KviKvsVariant * v2,KviKvsVariant * v3,KviKvsVariant * v4,KviKvsVariant * v5,KviKvsVariant * v6,KviKvsVariant * v7); - KviKvsVariantList(QString * s1); - KviKvsVariantList(QString * s1,QString * s2); - KviKvsVariantList(QString * s1,QString * s2,QString * s3); - KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4); - KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4,QString * s5); - KviKvsVariantList(QString * s1,QString * s2,QString * s3,QString * s4,QString * s5,QString * s6); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \param pV3 The third element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \param pV3 The third element's list + * \param pV4 The fourth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \param pV3 The third element's list + * \param pV4 The fourth element's list + * \param pV5 The fifth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \param pV3 The third element's list + * \param pV4 The fourth element's list + * \param pV5 The fifth element's list + * \param pV6 The sixth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5, KviKvsVariant * pV6); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pV1 The first element's list + * \param pV2 The second element's list + * \param pV3 The third element's list + * \param pV4 The fourth element's list + * \param pV5 The fifth element's list + * \param pV6 The sixth element's list + * \param pV7 The seventh element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(KviKvsVariant * pV1, KviKvsVariant * pV2, KviKvsVariant * pV3, KviKvsVariant * pV4, KviKvsVariant * pV5, KviKvsVariant * pV6, KviKvsVariant * pV7); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \param pS3 The third element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \param pS3 The third element's list + * \param pS4 The fourth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \param pS3 The third element's list + * \param pS4 The fourth element's list + * \param pS5 The fifth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \param pS3 The third element's list + * \param pS4 The fourth element's list + * \param pS5 The fifth element's list + * \param pS6 The sixth element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5, QString * pS6); + + /** + * \brief Constructs the KviKvsVariantList object + * \param pS1 The first element's list + * \param pS2 The second element's list + * \param pS3 The third element's list + * \param pS4 The fourth element's list + * \param pS5 The fifth element's list + * \param pS6 The sixth element's list + * \param pS7 The seventh element's list + * \return KviKvsVariantList + */ + KviKvsVariantList(QString * pS1, QString * pS2, QString * pS3, QString * pS4, QString * pS5, QString * pS6, QString * pS7); + + /** + * \brief Destroys the KviKvsVariantList object + */ ~KviKvsVariantList(); protected: KviPointerList<KviKvsVariant> * m_pList; public: + /** + * \brief Returns the first element of the list + * \return KviKvsVariant * + */ KviKvsVariant * first(){ return m_pList->first(); }; + + /** + * \brief Returns the next element of the list + * \return KviKvsVariant * + */ KviKvsVariant * next(){ return m_pList->next(); }; + + /** + * \brief Returns the element of the list at the given index + * \param iIdx The index of the list we want to extract + * \return KviKvsVariant * + */ KviKvsVariant * at(int iIdx){ return m_pList->at(iIdx); }; + + /** + * \brief Returns the size of the list + * \return unsigned int + */ unsigned int count(){ return m_pList->count(); }; + /** + * \brief Clears the list + * \return void + */ void clear(){ m_pList->clear(); }; - void append(const QString &szParam, bool bEscape=false){ m_pList->append(new KviKvsVariant(szParam, bEscape)); }; - void append(kvs_int_t iInteger){ m_pList->append(new KviKvsVariant(iInteger)); }; + /** + * \brief Appends an element to the list + * \param pItem The element to append + * \return void + */ + void append(KviKvsVariant * pItem){ m_pList->append(pItem); }; + + /** + * \brief Prepends an element to the list + * \param pItem The element to prepend + * \return void + */ + void prepend(KviKvsVariant * pItem){ m_pList->prepend(pItem); }; + + /** + * \brief Appends an element to the list + * \param szParam The string element to append + * \param bEscape Whether the string has to be escaped for KVS + * \return void + */ + void append(const QString & szParam, bool bEscape = false){ m_pList->append(new KviKvsVariant(szParam,bEscape)); }; + + /** + * \brief Appends an element to the list + * \param iInt The integer element to append + * \return void + */ + void append(kvs_int_t iInt){ m_pList->append(new KviKvsVariant(iInt)); }; + + /** + * \brief Appends an element to the list + * \param dReal The real element to append + * \return void + */ void append(kvs_real_t dReal){ m_pList->append(new KviKvsVariant(dReal)); }; + + /** + * \brief Appends an element to the list + * \param bBoolean The boolean element to append + * \return void + */ void append(bool bBoolean){ m_pList->append(new KviKvsVariant(bBoolean)); }; + + /** + * \brief Appends an element to the list + * \param hObject The hObject element to append + * \return void + */ void append(kvs_hobject_t hObject){ m_pList->append(new KviKvsVariant(hObject)); }; + + /** + * \brief Appends an element to the list + * \param pArray The array element to append + * \return void + */ void append(KviKvsArray * pArray){ m_pList->append(new KviKvsVariant(pArray)); }; - void append(KviKvsHash * pHash){ m_pList->append(new KviKvsVariant(pHash)); }; - void append(KviKvsVariant * v){ m_pList->append(v); }; - void prepend(KviKvsVariant * v){ m_pList->prepend(v); }; + /** + * \brief Appends an element to the list + * \param pHash The hash element to append + * \return void + */ + void append(KviKvsHash * pHash){ m_pList->append(new KviKvsVariant(pHash)); }; + /** + * \brief Sets the auto delete flag on the list + * \param bAutoDelete Whether the list has to auto delete itself + * \return void + */ void setAutoDelete(bool bAutoDelete); // this is TRUE by default - void allAsString(QString &szBuffer); - // returns true if there was a first parameter at all - bool firstAsString(QString &szBuffer); - // returns true if there was a next parameter at all - bool nextAsString(QString &szBuffer); + /** + * \brief Appends all elements in a single string delimited by spaces + * \param szBuffer The buffer where to store the string + * \return void + */ + void allAsString(QString & szBuffer); + + /** + * \brief Returns true if there was a first parameter at all + * \param szBuffer The buffer where to store the string + * \return bool + */ + bool firstAsString(QString & szBuffer); + + /** + * \brief Returns true if there was a next parameter at all + * \param szBuffer The buffer where to store the string + * \return bool + */ + bool nextAsString(QString & szBuffer); }; -#endif //!_KVI_KVS_VARIANTLIST_H_ +#endif // _KVI_KVS_VARIANTLIST_H_ |
