unsigned/size_t/shared ptrs

This commit is contained in:
Matej Sekoranja
2012-06-15 14:47:16 +02:00
parent 7307529f7f
commit 4b5bc38835
31 changed files with 742 additions and 543 deletions

View File

@@ -43,7 +43,7 @@ private:
return findMatchingBrace(request,closeBrace,numOpen-1);
}
static void createFieldRequest(PVStructure* pvParent,std::string request,bool fieldListOK) {
static void createFieldRequest(PVStructurePtr const & pvParent,std::string request,bool fieldListOK) {
trim(request);
if(request.length()<=0) return;
size_t comma = request.find(',');
@@ -57,9 +57,12 @@ private:
THROW_BASE_EXCEPTION("mismatched { }");
}
String fieldName = request.substr(0,openBrace);
std::auto_ptr<PVStructure> pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0));
createFieldRequest(pvStructure.get(),request.substr(openBrace+1,closeBrace-openBrace-1),false);
pvParent->appendPVField(pvStructure.release());
PVFieldPtrArray fields;
StringArray fieldNames;
PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields));
createFieldRequest(pvStructure,request.substr(openBrace+1,closeBrace-openBrace-1),false);
pvParent->appendPVField(fieldName, pvStructure);
if(request.length()>closeBrace+1) {
if(request.at(closeBrace+1) != ',') {
THROW_BASE_EXCEPTION("misssing , after }");
@@ -69,9 +72,9 @@ private:
return;
}
if(openBracket==std::string::npos && fieldListOK) {
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvParent, "fieldList", pvString)));
PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(request);
pvParent->appendPVField(pvStringField.release());
pvParent->appendPVField("fieldList", pvStringField);
return;
}
if(openBracket!=std::string::npos && (comma==std::string::npos || comma>openBracket)) {
@@ -95,30 +98,32 @@ private:
createLeafFieldRequest(pvParent,request);
}
static void createLeafFieldRequest(PVStructure* pvParent,String request) {
static void createLeafFieldRequest(PVStructurePtr const & pvParent,String request) {
size_t openBracket = request.find('[');
String fullName = request;
if(openBracket != std::string::npos) fullName = request.substr(0,openBracket);
size_t indLast = fullName.rfind('.');
String fieldName = fullName;
if(indLast>1 && indLast != std::string::npos) fieldName = fullName.substr(indLast+1);
std::auto_ptr<PVStructure> pvStructure(getPVDataCreate()->createPVStructure(pvParent, fieldName, 0));
std::auto_ptr<PVStructure> pvLeaf(getPVDataCreate()->createPVStructure(pvStructure.get(),"leaf", 0));
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvLeaf.get(), "source", pvString)));
PVFieldPtrArray fields;
StringArray fieldNames;
PVStructurePtr pvStructure(getPVDataCreate()->createPVStructure(fieldNames, fields));
PVStructurePtr pvLeaf(getPVDataCreate()->createPVStructure(fieldNames, fields));
PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(fullName);
pvLeaf->appendPVField(pvStringField.release());
pvLeaf->appendPVField("source", pvStringField);
if(openBracket != std::string::npos) {
size_t closeBracket = request.find(']');
if(closeBracket==std::string::npos) {
THROW_BASE_EXCEPTION("option does not have matching []");
}
createRequestOptions(pvLeaf.get(),request.substr(openBracket+1, closeBracket-openBracket-1));
createRequestOptions(pvLeaf,request.substr(openBracket+1, closeBracket-openBracket-1));
}
pvStructure->appendPVField(pvLeaf.release());
pvParent->appendPVField(pvStructure.release());
pvStructure->appendPVField("leaf", pvLeaf);
pvParent->appendPVField("fieldName", pvStructure);
}
static void createRequestOptions(PVStructure* pvParent,std::string request) {
static void createRequestOptions(PVStructurePtr const & pvParent,std::string request) {
trim(request);
if(request.length()<=1) return;
@@ -135,9 +140,9 @@ private:
if (equalsPos != std::string::npos)
{
std::auto_ptr<PVString> pvStringField(static_cast<PVString*>(getPVDataCreate()->createPVScalar(pvParent, token.substr(0, equalsPos), pvString)));
PVStringPtr pvStringField(std::tr1::static_pointer_cast<PVString>(getPVDataCreate()->createPVScalar(pvString)));
pvStringField->put(token.substr(equalsPos+1));
pvParent->appendPVField(pvStringField.release());
pvParent->appendPVField(token.substr(0, equalsPos), pvStringField);
}
}
}
@@ -146,11 +151,13 @@ public:
virtual PVStructure::shared_pointer createRequest(String request)
{
static String emptyString;
static PVFieldPtrArray emptyFields;
static StringArray emptyFieldNames;
if (!request.empty()) trim(request);
if (request.empty())
{
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0));
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
return pvStructure;
}
@@ -159,7 +166,7 @@ public:
size_t offsetPutField = request.find("putField(");
size_t offsetGetField = request.find("getField(");
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(0, emptyString, 0));
PVStructure::shared_pointer pvStructure(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
if (offsetRecord != std::string::npos) {
size_t offsetBegin = request.find('[', offsetRecord);
@@ -167,9 +174,9 @@ public:
if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("record[ does not have matching ]");
}
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "record", 0));
createRequestOptions(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1));
pvStructure->appendPVField(pvStruct.release());
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createRequestOptions(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1));
pvStructure->appendPVField("record", pvStruct);
}
if (offsetField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetField);
@@ -177,9 +184,9 @@ public:
if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("field( does not have matching )");
}
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "field", 0));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release());
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField("field", pvStruct);
}
if (offsetPutField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetPutField);
@@ -187,9 +194,9 @@ public:
if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("putField( does not have matching )");
}
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "putField", 0));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release());
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField("putField", pvStruct);
}
if (offsetGetField != std::string::npos) {
size_t offsetBegin = request.find('(', offsetGetField);
@@ -197,12 +204,12 @@ public:
if(offsetEnd == std::string::npos) {
THROW_BASE_EXCEPTION("getField( does not have matching )");
}
std::auto_ptr<PVStructure> pvStruct(getPVDataCreate()->createPVStructure(pvStructure.get(), "getField", 0));
createFieldRequest(pvStruct.get(),request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField(pvStruct.release());
PVStructure::shared_pointer pvStruct(getPVDataCreate()->createPVStructure(emptyFieldNames, emptyFields));
createFieldRequest(pvStruct,request.substr(offsetBegin+1, offsetEnd-offsetBegin-1),true);
pvStructure->appendPVField("getField", pvStruct);
}
if (pvStructure.get()->getStructure()->getNumberFields()==0) {
createFieldRequest(pvStructure.get(),request,true);
createFieldRequest(pvStructure,request,true);
}
return pvStructure;
}