git-svn-id: svn://db.shs.com.ru/pip@296 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
22
main.cpp
22
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<int>();
|
||||
PIPropertyStorage ps;
|
||||
piForeachC (PIPropertyStorage::Property & p, ps)
|
||||
;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -28,5 +28,6 @@
|
||||
#include "pivariant.h"
|
||||
#include "picli.h"
|
||||
#include "pichunkstream.h"
|
||||
#include "pipropertystorage.h"
|
||||
|
||||
#endif // PICOREMODULE_H
|
||||
|
||||
@@ -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();}
|
||||
|
||||
@@ -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() << ")";
|
||||
|
||||
Reference in New Issue
Block a user