PIVariant, PIGPIO

This commit is contained in:
2023-01-09 15:22:51 +03:00
parent f355cfc05e
commit 5c16953d95
3 changed files with 59 additions and 62 deletions

View File

@@ -18,6 +18,8 @@
*/ */
#include "pigpio.h" #include "pigpio.h"
#include "pitime.h"
#ifdef LINUX #ifdef LINUX
# define GPIO_SYS_CLASS # define GPIO_SYS_CLASS
#endif #endif

View File

@@ -65,7 +65,10 @@
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
PIMap<uint, __PIVariantInfo__ *> * __PIVariantInfoStorage__::map = nullptr; PIMap<uint, __PIVariantInfo__ *> & __PIVariantInfoStorage__::get() {
static PIMap<uint, __PIVariantInfo__ *> ret;
return ret;
}
#endif #endif
@@ -176,7 +179,7 @@ void PIVariant::setValueFromString(const PIString & v) {
} break; } break;
case PIVariant::pivCustom: { case PIVariant::pivCustom: {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
__PIVariantInfo__ * vi = __PIVariantInfoStorage__::get()->map->value(__PIVariantFunctions__<PIString>::typeIDHelper()); __PIVariantInfo__ * vi = __PIVariantInfoStorage__::get().value(__PIVariantFunctions__<PIString>::typeIDHelper());
if (vi) { if (vi) {
__PIVariantInfo__::castHelperFunc cf = vi->cast.value(_typeID); __PIVariantInfo__::castHelperFunc cf = vi->cast.value(_typeID);
if (cf) { if (cf) {
@@ -297,7 +300,7 @@ PIVariant::Type PIVariant::typeFromID(uint type_id) {
if (type_id == typeID<PILined>()) return PIVariant::pivLine; if (type_id == typeID<PILined>()) return PIVariant::pivLine;
if (type_id == typeID<PINetworkAddress>()) return PIVariant::pivNetworkAddress; if (type_id == typeID<PINetworkAddress>()) return PIVariant::pivNetworkAddress;
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
if (__PIVariantInfoStorage__::get()->map->contains(type_id)) return PIVariant::pivCustom; if (__PIVariantInfoStorage__::get().contains(type_id)) return PIVariant::pivCustom;
#endif #endif
return PIVariant::pivInvalid; return PIVariant::pivInvalid;
} }
@@ -377,7 +380,7 @@ PIVariant PIVariant::fromValue(const PIByteArray & c, uint type_id) {
PIVariant::Type t = typeFromID(type_id); PIVariant::Type t = typeFromID(type_id);
if (t == pivInvalid || t == pivCustom) { if (t == pivInvalid || t == pivCustom) {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
ret._info = __PIVariantInfoStorage__::get()->map->value(type_id, 0); ret._info = __PIVariantInfoStorage__::get().value(type_id, 0);
if (ret._info) { if (ret._info) {
t = pivCustom; t = pivCustom;
} else } else
@@ -399,7 +402,7 @@ PIVariant PIVariant::fromValue(const PIByteArray & c, const PIString & type) {
PIVariant::Type t = typeFromName(type); PIVariant::Type t = typeFromName(type);
if (t == pivInvalid) { if (t == pivInvalid) {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
ret._info = __PIVariantInfoStorage__::get()->map->value(type.hash(), 0); ret._info = __PIVariantInfoStorage__::get().value(type.hash(), 0);
if (ret._info) { if (ret._info) {
t = pivCustom; t = pivCustom;
} else } else
@@ -418,7 +421,7 @@ PIVariant PIVariant::fromValue(const PIByteArray & c, const PIString & type) {
PIVariant PIVariant::fromType(uint type_id) { PIVariant PIVariant::fromType(uint type_id) {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
__PIVariantInfo__ * vi = __PIVariantInfoStorage__::get()->map->value(type_id); __PIVariantInfo__ * vi = __PIVariantInfoStorage__::get().value(type_id);
if (!vi) return PIVariant(); if (!vi) return PIVariant();
return PIVariant::fromValue(vi->empty, type_id); return PIVariant::fromValue(vi->empty, type_id);
#else #else
@@ -471,7 +474,7 @@ PIString PIVariant::typeName(PIVariant::Type type) {
PIString PIVariant::typeNameFromID(uint type_id) { PIString PIVariant::typeNameFromID(uint type_id) {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
__PIVariantInfo__ * vi = __PIVariantInfoStorage__::get()->map->value(type_id); __PIVariantInfo__ * vi = __PIVariantInfoStorage__::get().value(type_id);
if (!vi) return PIString(); if (!vi) return PIString();
return vi->typeName; return vi->typeName;
#else #else
@@ -483,7 +486,7 @@ PIString PIVariant::typeNameFromID(uint type_id) {
PIVector<uint> PIVariant::knownTypeIDs() { PIVector<uint> PIVariant::knownTypeIDs() {
PIVector<uint> ret; PIVector<uint> ret;
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
auto it = __PIVariantInfoStorage__::get()->map->makeIterator(); auto it = __PIVariantInfoStorage__::get().makeIterator();
while (it.next()) while (it.next())
ret << it.key(); ret << it.key();
#endif #endif
@@ -493,7 +496,7 @@ PIVector<uint> PIVariant::knownTypeIDs() {
int PIVariant::knownTypeIDsCount() { int PIVariant::knownTypeIDsCount() {
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
return __PIVariantInfoStorage__::get()->map->size_s(); return __PIVariantInfoStorage__::get().size_s();
#endif #endif
return 0; return 0;
} }
@@ -1393,7 +1396,7 @@ PIString PIVariant::toString() const {
PIStringList r; PIStringList r;
ba >> r; ba >> r;
if (r.isEmpty()) return PIString(); if (r.isEmpty()) return PIString();
return r.join(";"); return r.join("%|%");
} }
case PIVariant::pivEnum: { case PIVariant::pivEnum: {
PIVariantTypes::Enum r; PIVariantTypes::Enum r;

View File

@@ -120,36 +120,29 @@ struct __PIVariantTypeInfo__ {
class PIP_EXPORT __PIVariantInfoStorage__ { class PIP_EXPORT __PIVariantInfoStorage__ {
public: public:
__PIVariantInfoStorage__() { static PIMap<uint, __PIVariantInfo__ *> & get();
if (!map) map = new PIMap<uint, __PIVariantInfo__ *>();
}
static __PIVariantInfoStorage__ * get() {
static __PIVariantInfoStorage__ * r = new __PIVariantInfoStorage__();
return r;
}
static PIMap<uint, __PIVariantInfo__ *> * map;
}; };
# define REGISTER_VARIANT(classname) \ # define REGISTER_VARIANT(classname) \
template<> \ template<> \
inline PIString __PIVariantFunctions__<classname>::typeNameHelper() { \ inline PIString __PIVariantFunctions__<classname>::typeNameHelper() { \
static PIString tn = PIStringAscii(#classname); \ static PIString tn = PIStringAscii(#classname); \
return tn; \ return tn; \
} \ } \
template<> \ template<> \
inline uint __PIVariantFunctions__<classname>::typeIDHelper() { \ inline uint __PIVariantFunctions__<classname>::typeIDHelper() { \
static uint ret = PIStringAscii(#classname).hash(); \ static uint ret = PIStringAscii(#classname).hash(); \
return ret; \ return ret; \
} \ } \
REGISTER_VARIANT_TYPEINFO(classname) \ REGISTER_VARIANT_TYPEINFO(classname) \
STATIC_INITIALIZER_BEGIN \ STATIC_INITIALIZER_BEGIN \
uint type_id = __PIVariantFunctions__<classname>::typeIDHelper(); \ uint type_id = __PIVariantFunctions__<classname>::typeIDHelper(); \
PIString type_name = __PIVariantFunctions__<classname>::typeNameHelper(); \ PIString type_name = __PIVariantFunctions__<classname>::typeNameHelper(); \
if (__PIVariantInfoStorage__::get()->map->contains(type_id)) return; \ if (__PIVariantInfoStorage__::get().contains(type_id)) return; \
PIByteArray empty; \ PIByteArray empty; \
empty << classname(); \ empty << classname(); \
(*(__PIVariantInfoStorage__::get()->map))[type_id] = new __PIVariantInfo__(type_name, empty); \ __PIVariantInfoStorage__::get()[type_id] = new __PIVariantInfo__(type_name, empty); \
STATIC_INITIALIZER_END STATIC_INITIALIZER_END
@@ -158,30 +151,29 @@ public:
template<> \ template<> \
inline classname_to __PIVariantFunctions__<classname_from>::castVariant<classname_to>(const classname_from & v); inline classname_to __PIVariantFunctions__<classname_from>::castVariant<classname_to>(const classname_from & v);
# define REGISTER_VARIANT_CAST_CPP(classname_from, classname_to) \ # define REGISTER_VARIANT_CAST_CPP(classname_from, classname_to) \
template<> \ template<> \
template<> \ template<> \
inline PIByteArray __PIVariantFunctions__<classname_from>::castHelper<classname_to>(PIByteArray v) { \ inline PIByteArray __PIVariantFunctions__<classname_from>::castHelper<classname_to>(PIByteArray v) { \
classname_from f; \ classname_from f; \
v >> f; \ v >> f; \
classname_to t = __PIVariantFunctions__<classname_from>::castVariant<classname_to>(f); \ classname_to t = __PIVariantFunctions__<classname_from>::castVariant<classname_to>(f); \
PIByteArray ret; \ PIByteArray ret; \
ret << t; \ ret << t; \
return ret; \ return ret; \
} \ } \
STATIC_INITIALIZER_BEGIN \ STATIC_INITIALIZER_BEGIN \
__PIVariantInfo__ * vi( \ __PIVariantInfo__ * vi(__PIVariantInfoStorage__::get().value(__PIVariantFunctions__<classname_from>::typeIDHelper(), nullptr)); \
__PIVariantInfoStorage__::get()->map->value(__PIVariantFunctions__<classname_from>::typeIDHelper(), nullptr)); \ if (!vi) { \
if (!vi) { \ piCout << "Warning! Using REGISTER_VARIANT_CAST(" #classname_from ", " #classname_to \
piCout << "Warning! Using REGISTER_VARIANT_CAST(" #classname_from ", " #classname_to \ ") before REGISTER_VARIANT(" #classname_from "), ignore."; \
") before REGISTER_VARIANT(" #classname_from "), ignore."; \ return; \
return; \ } \
} \ vi->cast[__PIVariantFunctions__<classname_to>::typeIDHelper()] = \
vi->cast[__PIVariantFunctions__<classname_to>::typeIDHelper()] = \ __PIVariantFunctions__<classname_from>::castHelper<classname_to>; \
__PIVariantFunctions__<classname_from>::castHelper<classname_to>; \ STATIC_INITIALIZER_END \
STATIC_INITIALIZER_END \ template<> \
template<> \ template<> \
template<> \
classname_to __PIVariantFunctions__<classname_from>::castVariant<classname_to>(const classname_from & v) classname_to __PIVariantFunctions__<classname_from>::castVariant<classname_to>(const classname_from & v)
# define REGISTER_VARIANT_CAST(classname_from, classname_to) \ # define REGISTER_VARIANT_CAST(classname_from, classname_to) \
@@ -945,7 +937,7 @@ private:
#ifdef CUSTOM_PIVARIANT #ifdef CUSTOM_PIVARIANT
_typeID = typeID<T>(); _typeID = typeID<T>();
if (_type == pivCustom) { if (_type == pivCustom) {
_info = __PIVariantInfoStorage__::get()->map->value(_typeID, 0); _info = __PIVariantInfoStorage__::get().value(_typeID, 0);
if (!_info) { if (!_info) {
_type = pivInvalid; _type = pivInvalid;
piCout << "Can`t initialize PIVariant from unregistered type!"; piCout << "Can`t initialize PIVariant from unregistered type!";