string serialization optimization
This commit is contained in:
@@ -47,7 +47,7 @@ namespace epics {
|
||||
else if(b==-2) {
|
||||
control->ensureData(sizeof(int32));
|
||||
int32 s = buffer->getInt();
|
||||
if(s<0) THROW_BASE_EXCEPTION("negative array size");
|
||||
if(s<0) THROW_BASE_EXCEPTION("negative size");
|
||||
return s;
|
||||
}
|
||||
else
|
||||
@@ -94,30 +94,41 @@ namespace epics {
|
||||
|
||||
static String emptyString;
|
||||
|
||||
// TODO consider by reference !!!
|
||||
String SerializeHelper::deserializeString(ByteBuffer* buffer,
|
||||
DeserializableControl* control) {
|
||||
|
||||
int size = SerializeHelper::readSize(buffer, control);
|
||||
if(size>=0) {
|
||||
char* retBuffer = new char[size]; // get the return buffer
|
||||
try {
|
||||
int i = 0;
|
||||
while(true) {
|
||||
int toRead = min(size-i, buffer->getRemaining());
|
||||
buffer->get(retBuffer, i, toRead);
|
||||
i += toRead;
|
||||
if(i<size)
|
||||
control->ensureData(1);
|
||||
else
|
||||
break;
|
||||
if(size>0)
|
||||
{
|
||||
if (buffer->getRemaining()>=size)
|
||||
{
|
||||
// entire string is in buffer, simply create a string out of it (copy)
|
||||
int pos = buffer->getPosition();
|
||||
String str(buffer->getArray()+pos, size);
|
||||
buffer->setPosition(pos+size);
|
||||
return str;
|
||||
}
|
||||
else
|
||||
{
|
||||
String str;
|
||||
str.reserve(size);
|
||||
try {
|
||||
int i = 0;
|
||||
while(true) {
|
||||
int toRead = min(size-i, buffer->getRemaining());
|
||||
int pos = buffer->getPosition();
|
||||
str.append(buffer->getArray()+pos, toRead);
|
||||
buffer->setPosition(pos+toRead);
|
||||
i += toRead;
|
||||
if(i<size)
|
||||
control->ensureData(1); // at least one
|
||||
else
|
||||
break;
|
||||
}
|
||||
return str;
|
||||
} catch(...) {
|
||||
throw;
|
||||
}
|
||||
String s = String(retBuffer, size);
|
||||
delete[] retBuffer;
|
||||
return s;
|
||||
} catch(...) {
|
||||
delete[] retBuffer; // remove the buffer
|
||||
throw;
|
||||
}
|
||||
}
|
||||
else
|
||||
|
||||
@@ -624,6 +624,13 @@ void testStructure(std::ostream& ofile) {
|
||||
}
|
||||
*/
|
||||
|
||||
void testStringCopy(std::ostream& ofile) {
|
||||
String s1 = "abc";
|
||||
String s2 = s1;
|
||||
if (s1.c_str() != s2.c_str())
|
||||
ofile << "\n!!! implementation of epics::pvData::String assigment operator does not share content !!!\n\n";
|
||||
}
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
std::ofstream outfile;
|
||||
std::ostream *out=NULL;
|
||||
@@ -640,6 +647,7 @@ int main(int argc, char *argv[]) {
|
||||
control = new DeserializableControlImpl();
|
||||
buffer = new ByteBuffer(1<<16);
|
||||
|
||||
testStringCopy(*out);
|
||||
testScalarEquals(*out);
|
||||
testScalar(*out);
|
||||
testArray(*out);
|
||||
|
||||
Reference in New Issue
Block a user