version 2.39.0
PIString works with PIConstChars picodeinfo optimizations PIIODevice::availableClasses
This commit is contained in:
@@ -614,7 +614,7 @@ int PIFile::writeDevice(const void * data, int max_size) {
|
||||
|
||||
|
||||
PIFile &PIFile::operator <<(const PIString & v) {
|
||||
if (canWrite() && PRIVATE->fd != 0)
|
||||
if (canWrite() && v.isNotEmpty() && PRIVATE->fd != 0)
|
||||
*this << v.toCharset(defaultCharset());
|
||||
return *this;
|
||||
}
|
||||
|
||||
@@ -266,11 +266,9 @@ void PIIODevice::write_func() {
|
||||
|
||||
PIIODevice * PIIODevice::newDeviceByPrefix(const char * prefix) {
|
||||
if (!prefix) return nullptr;
|
||||
PIConstChars p(prefix);
|
||||
for (const auto & i: fabrics()) {
|
||||
if (i.first == p)
|
||||
return i.second();
|
||||
}
|
||||
auto fi = fabrics().value(prefix);
|
||||
if (fi.fabricator)
|
||||
return fi.fabricator();
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
@@ -488,17 +486,30 @@ void PIIODevice::splitFullPath(PIString fpwm, PIString * full_path, DeviceMode *
|
||||
PIStringList PIIODevice::availablePrefixes() {
|
||||
PIStringList ret;
|
||||
for (const auto & i: fabrics())
|
||||
ret << i.first.toString();
|
||||
ret << i.second.prefix.toString();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void PIIODevice::registerDevice(const char * prefix, PIIODevice * (*fabric)()) {
|
||||
PIStringList PIIODevice::availableClasses() {
|
||||
PIStringList ret;
|
||||
for (const auto & i: fabrics())
|
||||
ret << i.second.classname.toString();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
void PIIODevice::registerDevice(const char * prefix, const char * classname, PIIODevice * (*fabric)()) {
|
||||
PIConstChars p(prefix);
|
||||
if (p.isEmpty()) return;
|
||||
//printf("registerDevice %s %d %d\n", prefix, p.isEmpty(), fabrics().size());
|
||||
if (!fabrics().contains(p))
|
||||
fabrics()[p] = fabric;
|
||||
if (!fabrics().contains(p)) {
|
||||
FabricInfo fi;
|
||||
fi.prefix = prefix;
|
||||
fi.classname = classname;
|
||||
fi.fabricator = fabric;
|
||||
fabrics()[p] = fi;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -555,8 +566,8 @@ void PIIODevice::cacheFullPath(const PIString & full_path, const PIIODevice * d)
|
||||
}
|
||||
|
||||
|
||||
PIMap<PIConstChars, PIIODevice * (*)()> & PIIODevice::fabrics() {
|
||||
static PIMap<PIConstChars, PIIODevice * (*)()> ret;
|
||||
PIMap<PIConstChars, PIIODevice::FabricInfo> & PIIODevice::fabrics() {
|
||||
static PIMap<PIConstChars, FabricInfo> ret;
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
@@ -47,7 +47,7 @@ typedef bool (*ReadRetFunc)(void * , uchar * , int );
|
||||
|
||||
# define REGISTER_DEVICE(name) \
|
||||
STATIC_INITIALIZER_BEGIN \
|
||||
PIIODevice::registerDevice(name::fullPathPrefixS(), []()->PIIODevice*{return new name();});\
|
||||
PIIODevice::registerDevice(name::fullPathPrefixS(), #name, []()->PIIODevice*{return new name();});\
|
||||
STATIC_INITIALIZER_END
|
||||
|
||||
# define PIIODEVICE(name, prefix) \
|
||||
@@ -90,6 +90,12 @@ public:
|
||||
Reliable /*! Channel without data errors / corruptions */ = 0x02
|
||||
};
|
||||
|
||||
struct FabricInfo {
|
||||
PIConstChars prefix;
|
||||
PIConstChars classname;
|
||||
PIIODevice*(*fabricator)() = nullptr;
|
||||
};
|
||||
|
||||
typedef PIFlags<DeviceOption> DeviceOptions;
|
||||
typedef PIFlags<DeviceInfoFlag> DeviceInfoFlags;
|
||||
|
||||
@@ -271,7 +277,10 @@ public:
|
||||
//! Returns fullPath prefixes of all registered devices
|
||||
static PIStringList availablePrefixes();
|
||||
|
||||
static void registerDevice(const char * prefix, PIIODevice*(*fabric)());
|
||||
//! Returns class names of all registered devices
|
||||
static PIStringList availableClasses();
|
||||
|
||||
static void registerDevice(const char * prefix, const char * classname, PIIODevice*(*fabric)());
|
||||
|
||||
|
||||
EVENT_HANDLER(bool, open);
|
||||
@@ -421,7 +430,7 @@ private:
|
||||
void run();
|
||||
void end() {terminate();}
|
||||
static void cacheFullPath(const PIString & full_path, const PIIODevice * d);
|
||||
static PIMap<PIConstChars, PIIODevice*(*)()> & fabrics();
|
||||
static PIMap<PIConstChars, FabricInfo> & fabrics();
|
||||
|
||||
PITimer timer;
|
||||
PITimeMeasurer tm;
|
||||
|
||||
Reference in New Issue
Block a user