diff --git a/main.cpp b/main.cpp index 6d84176f..1443675b 100644 --- a/main.cpp +++ b/main.cpp @@ -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(); + PIPropertyStorage ps; + piForeachC (PIPropertyStorage::Property & p, ps) + ; return 0; } diff --git a/src/core/picoremodule.h b/src/core/picoremodule.h index ef0b8baa..881f6190 100644 --- a/src/core/picoremodule.h +++ b/src/core/picoremodule.h @@ -28,5 +28,6 @@ #include "pivariant.h" #include "picli.h" #include "pichunkstream.h" +#include "pipropertystorage.h" #endif // PICOREMODULE_H diff --git a/src/core/pipropertystorage.h b/src/core/pipropertystorage.h index 53da16d5..37f0b76d 100644 --- a/src/core/pipropertystorage.h +++ b/src/core/pipropertystorage.h @@ -20,6 +20,7 @@ public: typedef PIVector::const_iterator const_iterator; typedef PIVector::iterator iterator; + typedef Property value_type; iterator begin() {return props.begin();} const_iterator begin() const {return props.begin();} diff --git a/src/core/pivariant.h b/src/core/pivariant.h index cc5920fe..91bb8010 100755 --- a/src/core/pivariant.h +++ b/src/core/pivariant.h @@ -125,6 +125,19 @@ classname_to __PIVariantFunctions__::castVariant(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 static Type getType() {return pivCustom;} - template void initType(const T & v) { + template inline static Type getType() {return pivCustom;} + template inline void initType(const T & v) { _content.clear(); _content << v; _type = getType(); @@ -475,17 +488,17 @@ private: _info = 0; #endif } - template static T getAsValue(const PIVariant & v) { + template inline static T getAsValue(const PIVariant & v) { #ifdef CUSTOM_PIVARIANT if (v._content.isEmpty() || !v._info) return T(); PIString cn = __PIVariantFunctions__::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() {return PIVariant template<> inline PIVariant::Type PIVariant::getType() {return PIVariant::pivDateTime;} template<> inline PIVariant::Type PIVariant::getType() {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() << ")";