git-svn-id: svn://db.shs.com.ru/pip@296 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5

This commit is contained in:
2016-12-15 07:59:33 +00:00
parent d9afd33707
commit d0106d047e
4 changed files with 64 additions and 6 deletions

View File

@@ -1,7 +1,27 @@
#include "pip.h"
struct __S__ {
PIString text;
int i;
};
inline PIByteArray & operator <<(PIByteArray & s, const __S__ & v) {s << v.text << v.i; return s;}
inline PIByteArray & operator >>(PIByteArray & s, __S__ & v) {s >> v.text >> v.i; return s;}
REGISTER_VARIANT(__S__)
REGISTER_VARIANT_CAST(__S__, PIString) {return v.text + PIString::fromNumber(v.i);}
REGISTER_VARIANT_CAST(__S__, int) {return v.i;}
int main(int argc, char *argv[]) {
sleep(30);
__S__ s, s1;
s.text = "123";
s.i = -1;
PIVariant v = PIVariant::fromValue(s);
piCout << v;
s1 = v.value<__S__>();
piCout << s1.text << s1.i << v.value<int>();
PIPropertyStorage ps;
piForeachC (PIPropertyStorage::Property & p, ps)
;
return 0;
}

View File

@@ -28,5 +28,6 @@
#include "pivariant.h"
#include "picli.h"
#include "pichunkstream.h"
#include "pipropertystorage.h"
#endif // PICOREMODULE_H

View File

@@ -20,6 +20,7 @@ public:
typedef PIVector<Property>::const_iterator const_iterator;
typedef PIVector<Property>::iterator iterator;
typedef Property value_type;
iterator begin() {return props.begin();}
const_iterator begin() const {return props.begin();}

View File

@@ -125,6 +125,19 @@ classname_to __PIVariantFunctions__<classname_from>::castVariant<classname_to>(c
#define REGISTER_VARIANT_CAST_SIMPLE_H(classname_from, classname_to) REGISTER_VARIANT_CAST_H(classname_from, classname_to)
#define REGISTER_VARIANT_CAST_SIMPLE_CPP(classname_from, classname_to) REGISTER_VARIANT_CAST_CPP(classname_from, classname_to) {return classname_to(v);}
#else
#define REGISTER_VARIANT_H(classname)
#define REGISTER_VARIANT_CPP(classname)
#define INIT_VARIANT(classname)
#define REGISTER_VARIANT(classname)
#define REGISTER_VARIANT_CAST_H(classname_from, classname_to)
#define REGISTER_VARIANT_CAST_CPP(classname_from, classname_to)
#define REGISTER_VARIANT_CAST(classname_from, classname_to)
#define REGISTER_VARIANT_CAST_SIMPLE(classname_from, classname_to)
#define REGISTER_VARIANT_CAST_SIMPLE_H(classname_from, classname_to)
#define REGISTER_VARIANT_CAST_SIMPLE_CPP(classname_from, classname_to)
#endif
class PIP_EXPORT PIVariant {
@@ -461,8 +474,8 @@ public:
private:
void destroy() {_content.clear();}
template <typename T> static Type getType() {return pivCustom;}
template <typename T> void initType(const T & v) {
template <typename T> inline static Type getType() {return pivCustom;}
template <typename T> inline void initType(const T & v) {
_content.clear();
_content << v;
_type = getType<T>();
@@ -475,17 +488,17 @@ private:
_info = 0;
#endif
}
template<typename T> static T getAsValue(const PIVariant & v) {
template<typename T> inline static T getAsValue(const PIVariant & v) {
#ifdef CUSTOM_PIVARIANT
if (v._content.isEmpty() || !v._info) return T();
PIString cn = __PIVariantFunctions__<T>::typeNameHelper();
piCout << "gav" << cn;
//piCout << "gav" << cn;
PIByteArray ba;
if (cn == v._info->typeName) {
ba = v._content;
} else {
__PIVariantInfo__::castHelperFunc cf = v._info->cast.value(cn);
piCout << "gav cast" << cf;
//piCout << "gav cast" << cf;
if (!cf) return T();
ba = cf(v._content);
}
@@ -575,6 +588,29 @@ template<> inline PIVariant::Type PIVariant::getType<PIDate>() {return PIVariant
template<> inline PIVariant::Type PIVariant::getType<PIDateTime>() {return PIVariant::pivDateTime;}
template<> inline PIVariant::Type PIVariant::getType<PISystemTime>() {return PIVariant::pivSystemTime;}
REGISTER_VARIANT(bool)
REGISTER_VARIANT(char)
REGISTER_VARIANT(uchar)
REGISTER_VARIANT(short)
REGISTER_VARIANT(ushort)
REGISTER_VARIANT(int)
REGISTER_VARIANT(uint)
REGISTER_VARIANT(llong)
REGISTER_VARIANT(ullong)
REGISTER_VARIANT(float)
REGISTER_VARIANT(double)
REGISTER_VARIANT(ldouble)
REGISTER_VARIANT(complexd)
REGISTER_VARIANT(complexld)
REGISTER_VARIANT(PIBitArray)
REGISTER_VARIANT(PIByteArray)
REGISTER_VARIANT(PIString)
REGISTER_VARIANT(PIStringList)
REGISTER_VARIANT(PITime)
REGISTER_VARIANT(PIDate)
REGISTER_VARIANT(PIDateTime)
REGISTER_VARIANT(PISystemTime)
inline PICout operator <<(PICout s, const PIVariant & v) {
s.space(); s.setControl(0, true);
s << "PIVariant(" << v.typeName() << ", " << v.toString() << ")";