From f6c9b0eea355fa9fb0e684f3d68328c3811c9450 Mon Sep 17 00:00:00 2001 From: Marty Kraimer Date: Mon, 27 Sep 2010 08:33:10 -0400 Subject: [PATCH] 1) implemented noDefaultMethods. See effective C++ Item 6. There it is called Uncopyable 2) implemented Lock. See effective C++ item 14. This is as easy to use as Java synchronize. 3) wrapper on top of std::string. All usage of string in pvData is one of: String - Just a std::string StringBuilder - Used where StringBuilder is used in Java StringConst - Just a "std::string const". This is used wherever String is used in Java StringConstArray - Just like a String[] in Java. 4) The reference counting (incReferenceCount and decReferenceCount) are now private. It is completely handled by the implenentaion. NO code that uses pvData needs even know about reference counting. --- pvDataApp/factory/AbstractPVArray.h | 16 +- pvDataApp/factory/AbstractPVField.h | 22 +-- pvDataApp/factory/BasePVDouble.h | 12 +- pvDataApp/factory/BasePVDoubleArray.h | 11 +- pvDataApp/factory/BasePVStructure.h | 40 ++--- pvDataApp/factory/BasePVStructureArray.h | 8 +- pvDataApp/factory/Convert.cpp | 26 +-- pvDataApp/factory/FieldCreateFactory.cpp | 117 +++++++------ pvDataApp/factory/PVAuxInfoImpl.cpp | 29 ++-- pvDataApp/factory/PVDataCreateFactory.cpp | 30 ++-- pvDataApp/factory/TypeFunc.cpp | 28 +-- pvDataApp/factory/factory.h | 2 - pvDataApp/misc/Makefile | 2 + pvDataApp/misc/bitSet.h | 1 - pvDataApp/misc/byteBuffer.h | 5 +- pvDataApp/misc/lock.h | 32 ++++ pvDataApp/misc/noDefaultMethods.h | 22 +++ pvDataApp/misc/requester.h | 5 +- pvDataApp/pv/convert.h | 16 +- pvDataApp/pv/pvData.h | 198 ++++++++-------------- pvDataApp/pv/pvIntrospect.h | 47 ++--- pvDataApp/test/Makefile | 4 - pvDataApp/test/testDumpStdString.cpp | 116 ------------- pvDataApp/test/testIntrospect.cpp | 68 ++++---- pvDataApp/test/testPVAuxInfo.cpp | 21 ++- pvDataApp/test/testPVScalar.cpp | 21 ++- 26 files changed, 377 insertions(+), 522 deletions(-) create mode 100644 pvDataApp/misc/lock.h create mode 100644 pvDataApp/misc/noDefaultMethods.h delete mode 100644 pvDataApp/test/testDumpStdString.cpp diff --git a/pvDataApp/factory/AbstractPVArray.h b/pvDataApp/factory/AbstractPVArray.h index 74414cb..aafefe8 100644 --- a/pvDataApp/factory/AbstractPVArray.h +++ b/pvDataApp/factory/AbstractPVArray.h @@ -30,11 +30,11 @@ namespace epics { namespace pvData { int PVArray::getLength() const {return pImpl->length;} - static std::string fieldImmutable("field is immutable"); + static StringConst fieldImmutable("field is immutable"); void PVArray::setLength(int length) { if(PVField::isImmutable()) { - PVField::message(&fieldImmutable,errorMessage); + PVField::message(fieldImmutable,errorMessage); return; } if(length>pImpl->capacity) this->setCapacity(length); @@ -54,29 +54,29 @@ namespace epics { namespace pvData { void PVArray::setCapacityImmutable(epicsBoolean isMutable) { if(isMutable && PVField::isImmutable()) { - PVField::message(&fieldImmutable,errorMessage); + PVField::message(fieldImmutable,errorMessage); return; } pImpl->capacityMutable = isMutable; } - static std::string capacityImmutable("capacity is immutable"); + static StringConst capacityImmutable("capacity is immutable"); void PVArray::setCapacity(int capacity) { if(PVField::isImmutable()) { - PVField::message(&fieldImmutable,errorMessage); + PVField::message(fieldImmutable,errorMessage); return; } if(pImpl->capacityMutable==epicsFalse) { - PVField::message(&capacityImmutable,errorMessage); + PVField::message(capacityImmutable,errorMessage); return; } pImpl->capacity = capacity; } - void PVArray::toString(StringPtr buf) const {toString(buf,0);} + void PVArray::toString(StringBuilder buf) const {toString(buf,0);} - void PVArray::toString(StringPtr buf, int indentLevel) const + void PVArray::toString(StringBuilder buf, int indentLevel) const { throw std::logic_error(notImplemented); } diff --git a/pvDataApp/factory/AbstractPVField.h b/pvDataApp/factory/AbstractPVField.h index 45b33cb..8b280ee 100644 --- a/pvDataApp/factory/AbstractPVField.h +++ b/pvDataApp/factory/AbstractPVField.h @@ -11,7 +11,7 @@ namespace epics { namespace pvData { -static std::string notImplemented("not implemented"); +static StringConst notImplemented("not implemented"); static Convert *convert = 0; @@ -60,27 +60,27 @@ static std::string notImplemented("not implemented"); delete pImpl; } - StringConstPtr PVField::getRequesterName() const + StringConst PVField::getRequesterName() const { - static std::string none("none"); + static StringConst none("none"); if(pImpl->requester!=0) return pImpl->requester->getRequesterName(); - return &none; + return none; } - void PVField::message(StringConstPtr message,MessageType messageType) const + void PVField::message(StringConst message,MessageType messageType) const { if(pImpl->requester) { pImpl->requester->message(message,messageType); } else { printf("%s %s %s\n", messageTypeName[messageType].c_str(), - pImpl->field->getFieldName()->c_str(), - message->c_str()); + pImpl->field->getFieldName().c_str(), + message.c_str()); } } void PVField::setRequester(Requester *prequester) { - static std::string requesterPresent = + static StringConst requesterPresent = "Logic Error. requester is already present"; if(pImpl->requester==0) { pImpl->requester = prequester; @@ -127,7 +127,7 @@ static std::string notImplemented("not implemented"); throw std::logic_error(notImplemented); } - void PVField::renameField(StringConstPtr newName) + void PVField::renameField(StringConst newName) { throw std::logic_error(notImplemented); } @@ -142,9 +142,9 @@ static std::string notImplemented("not implemented"); throw std::logic_error(notImplemented); } - void PVField::toString(StringPtr buf) const {toString(buf,0);} + void PVField::toString(StringBuilder buf) const {toString(buf,0);} - void PVField::toString(StringPtr buf,int indentLevel) const + void PVField::toString(StringBuilder buf,int indentLevel) const { throw std::logic_error(notImplemented); } diff --git a/pvDataApp/factory/BasePVDouble.h b/pvDataApp/factory/BasePVDouble.h index de16d19..4a5efd6 100644 --- a/pvDataApp/factory/BasePVDouble.h +++ b/pvDataApp/factory/BasePVDouble.h @@ -24,16 +24,12 @@ namespace epics { namespace pvData { SerializableControl *pflusher) const; virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher); - virtual void toString(StringPtr buf)const; - virtual void toString(StringPtr buf,int indentLevel)const; + virtual void toString(StringBuilder buf)const; + virtual void toString(StringBuilder buf,int indentLevel)const; private: - BasePVDouble(); // not implemented - BasePVDouble(BasePVDouble const & ); // not implemented - BasePVDouble & operator=(BasePVDouble const &); //not implemented double value; }; - BasePVDouble::BasePVDouble(PVStructure *parent,ScalarConstPtr scalar) : PVDouble(parent,scalar),value(0.0) {} @@ -56,9 +52,9 @@ namespace epics { namespace pvData { throw std::logic_error(notImplemented); } - void BasePVDouble::toString(StringPtr buf)const {toString(buf,0);} + void BasePVDouble::toString(StringBuilder buf)const {toString(buf,0);} - void BasePVDouble::toString(StringPtr buf,int indentLevel) const + void BasePVDouble::toString(StringBuilder buf,int indentLevel) const { convert->getString(buf,this,indentLevel); PVField::toString(buf,indentLevel); diff --git a/pvDataApp/factory/BasePVDoubleArray.h b/pvDataApp/factory/BasePVDoubleArray.h index 55a5b3d..e74cf9d 100644 --- a/pvDataApp/factory/BasePVDoubleArray.h +++ b/pvDataApp/factory/BasePVDoubleArray.h @@ -30,11 +30,10 @@ namespace epics { namespace pvData { virtual void deserialize(ByteBuffer *pbuffer,DeserializableControl *pflusher); virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, int offset, int count) const; - virtual void toString(StringPtr buf)const; - virtual void toString(StringPtr buf,int indentLevel)const; + virtual void toString(StringBuilder buf)const; + virtual void toString(StringBuilder buf,int indentLevel)const; private: - BasePVDoubleArray(); // not implemented - DoubleArrayPtr doubleArray; + double *doubleArray; }; BasePVDoubleArray::BasePVDoubleArray(PVStructure *parent, @@ -88,12 +87,12 @@ namespace epics { namespace pvData { throw std::logic_error(notImplemented); } - void BasePVDoubleArray::toString(StringPtr buf)const + void BasePVDoubleArray::toString(StringBuilder buf)const { toString(buf,1); } - void BasePVDoubleArray::toString(StringPtr buf,int indentLevel)const + void BasePVDoubleArray::toString(StringBuilder buf,int indentLevel)const { convert->getString(buf,this,indentLevel); PVArray::toString(buf,indentLevel); diff --git a/pvDataApp/factory/BasePVStructure.h b/pvDataApp/factory/BasePVStructure.h index 2501f7a..915e97f 100644 --- a/pvDataApp/factory/BasePVStructure.h +++ b/pvDataApp/factory/BasePVStructure.h @@ -17,7 +17,7 @@ namespace epics { namespace pvData { int numberFields; PVFieldArrayPtr pvFields; - std::string const extendsStructureName; + StringConst const extendsStructureName; }; PVStructurePvt::PVStructurePvt() @@ -58,7 +58,7 @@ namespace epics { namespace pvData { return pImpl->pvFields; } - PVFieldPtr PVStructure::getSubField(StringConstPtr fieldName) + PVFieldPtr PVStructure::getSubField(StringConst fieldName) { throw std::logic_error(notImplemented); } @@ -78,82 +78,82 @@ namespace epics { namespace pvData { throw std::logic_error(notImplemented); } - void PVStructure::removePVField(StringConstPtr fieldName) + void PVStructure::removePVField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVBoolean *PVStructure::getBooleanField(StringConstPtr fieldName) + PVBoolean *PVStructure::getBooleanField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVByte *PVStructure::getByteField(StringConstPtr fieldName) + PVByte *PVStructure::getByteField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVShort *PVStructure::getShortField(StringConstPtr fieldName) + PVShort *PVStructure::getShortField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVInt *PVStructure::getIntField(StringConstPtr fieldName) + PVInt *PVStructure::getIntField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVLong *PVStructure::getLongField(StringConstPtr fieldName) + PVLong *PVStructure::getLongField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVFloat *PVStructure::getFloatField(StringConstPtr fieldName) + PVFloat *PVStructure::getFloatField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVDouble *PVStructure::getDoubleField(StringConstPtr fieldName) + PVDouble *PVStructure::getDoubleField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVString *PVStructure::getStringField(StringConstPtr fieldName) + PVString *PVStructure::getStringField(StringConst fieldName) { throw std::logic_error(notImplemented); } - PVStructure *PVStructure::getStructureField(StringConstPtr fieldName) + PVStructure *PVStructure::getStructureField(StringConst fieldName) { throw std::logic_error(notImplemented); } PVScalarArray *PVStructure::getScalarArrayField( - StringConstPtr fieldName,ScalarType elementType) + StringConst fieldName,ScalarType elementType) { throw std::logic_error(notImplemented); } PVStructureArray *PVStructure::getStructureArrayField( - StringConstPtr fieldName) + StringConst fieldName) { throw std::logic_error(notImplemented); } - StringConstPtr PVStructure::getExtendsStructureName() + StringConst PVStructure::getExtendsStructureName() { throw std::logic_error(notImplemented); } epicsBoolean PVStructure::putExtendsStructureName( - StringConstPtr extendsStructureName) + StringConst extendsStructureName) { throw std::logic_error(notImplemented); } - void PVStructure::toString(StringPtr buf) const {toString(buf,0);} + void PVStructure::toString(StringBuilder buf) const {toString(buf,0);} - void PVStructure::toString(StringPtr buf,int indentLevel) const + void PVStructure::toString(StringBuilder buf,int indentLevel) const { throw std::logic_error(notImplemented); } @@ -193,10 +193,6 @@ namespace epics { namespace pvData { BasePVStructure(PVStructure *parent,StructureConstPtr structure); ~BasePVStructure(); private: - BasePVStructure(); // not implemented - BasePVStructure(BasePVStructure const & ); // not implemented - BasePVStructure& operator=(BasePVStructure const &); //not implemented - }; BasePVStructure::BasePVStructure(PVStructure *parent,StructureConstPtr structure) diff --git a/pvDataApp/factory/BasePVStructureArray.h b/pvDataApp/factory/BasePVStructureArray.h index 6b53b6c..fb08959 100644 --- a/pvDataApp/factory/BasePVStructureArray.h +++ b/pvDataApp/factory/BasePVStructureArray.h @@ -85,9 +85,9 @@ namespace epics { namespace pvData { throw std::logic_error(notImplemented); } - void PVStructureArray::toString(StringPtr buf) const {toString(buf,0);} + void PVStructureArray::toString(StringBuilder buf) const {toString(buf,0);} - void PVStructureArray::toString(StringPtr buf,int indentLevel) const + void PVStructureArray::toString(StringBuilder buf,int indentLevel) const { throw std::logic_error(notImplemented); } @@ -99,10 +99,6 @@ namespace epics { namespace pvData { : PVStructureArray(parent,structureArray) {} ~BasePVStructureArray(){} private: - // following not implemented - BasePVStructureArray(); - BasePVStructureArray(BasePVStructureArray const & ); - BasePVStructureArray & operator=(BasePVStructureArray const &); }; }} diff --git a/pvDataApp/factory/Convert.cpp b/pvDataApp/factory/Convert.cpp index dbcf661..4f4f430 100644 --- a/pvDataApp/factory/Convert.cpp +++ b/pvDataApp/factory/Convert.cpp @@ -1,7 +1,7 @@ /* Convert.cpp */ #include #include -#include +#include #include "convert.h" namespace epics { namespace pvData { @@ -12,39 +12,39 @@ static std::string notImplemented("not implemented"); Convert::~Convert(){} - void Convert::getFullName(StringConstPtr buf,PVField const *pvField) + void Convert::getFullName(StringConst buf,PVField const *pvField) { throw std::logic_error(notImplemented); } - void Convert::getString(StringPtr buf,PVField const * pvField,int indentLevel) + void Convert::getString(StringBuilder buf,PVField const * pvField,int indentLevel) { throw std::logic_error(notImplemented); } - void Convert::getString(StringPtr buf,PVField const *pvField) + void Convert::getString(StringBuilder buf,PVField const *pvField) { throw std::logic_error(notImplemented); } - void Convert::fromString(PVScalar *pv, StringConstPtr from) + void Convert::fromString(PVScalar *pv, StringConst from) { throw std::logic_error(notImplemented); } - int Convert::fromString(PVScalarArray *pv, StringConstPtr from) + int Convert::fromString(PVScalarArray *pv, StringConst from) { throw std::logic_error(notImplemented); } int Convert::fromStringArray(PVScalarArray *pv, int offset, int length, - StringPtrArray from, int fromOffset) + StringConstArray from, int fromOffset) { throw std::logic_error(notImplemented); } int Convert::toStringArray(PVScalarArray const *pv, int offset, int length, - StringPtrArray to, int fromOffset) + StringConstArray to, int fromOffset) { throw std::logic_error(notImplemented); } @@ -237,7 +237,7 @@ static std::string notImplemented("not implemented"); throw std::logic_error(notImplemented); } - void Convert::newLine(StringPtr buffer, int indentLevel) + void Convert::newLine(StringBuilder buffer, int indentLevel) { *buffer += "\n"; for(int i=0; ilock(); - if(instance==0) instance = new ConvertExt(); - lock->unlock(); + static Mutex *mutex = new Mutex(); + Lock xx(mutex); + + if(instance==0) instance = new ConvertExt(); return instance; } diff --git a/pvDataApp/factory/FieldCreateFactory.cpp b/pvDataApp/factory/FieldCreateFactory.cpp index 516f351..81284dc 100644 --- a/pvDataApp/factory/FieldCreateFactory.cpp +++ b/pvDataApp/factory/FieldCreateFactory.cpp @@ -3,13 +3,14 @@ #include #include #include -#include +#include #include "pvIntrospect.h" #include "factory.h" namespace epics { namespace pvData { - static void newLine(StringPtr buffer, int indentLevel) + static DebugLevel debugLevel = highDebug; + static void newLine(StringBuilder buffer, int indentLevel) { *buffer += "\n"; for(int i=0; igetFieldName(); + StringConst name = fields[i]->getFieldName(); // look for duplicates for(int j=i+1; jgetFieldName(); - int result = name->compare(*otherName); + StringConst otherName = fields[j]->getFieldName(); + int result = name.compare(otherName); if(result==0) { - std::string message("duplicate fieldName "); - message += *name; + String message("duplicate fieldName "); + message += name; throw std::invalid_argument(message); } } @@ -166,32 +165,32 @@ namespace epics { namespace pvData { } } BaseStructure::~BaseStructure() { - if(debugLevel==highDebug) printf("~BaseStructure %s\n",BaseField::getFieldName()->c_str()); + if(debugLevel==highDebug) printf("~BaseStructure %s\n",BaseField::getFieldName().c_str()); for(int i=0; idecReferenceCount(); } } - FieldConstPtr BaseStructure::getField(StringConstPtr fieldName) const { + FieldConstPtr BaseStructure::getField(StringConst fieldName) const { for(int i=0; icompare(*pfield->getFieldName()); + int result = fieldName.compare(pfield->getFieldName()); if(result==0) return pfield; } return 0; } - int BaseStructure::getFieldIndex(StringConstPtr fieldName) const { + int BaseStructure::getFieldIndex(StringConst fieldName) const { for(int i=0; icompare(*pfield->getFieldName()); + int result = fieldName.compare(pfield->getFieldName()); if(result==0) return i; } return -1; } - void BaseStructure::toString(StringPtr buffer,int indentLevel) const{ + void BaseStructure::toString(StringBuilder buffer,int indentLevel) const{ BaseField::toString(buffer,indentLevel); *buffer += " {"; for(int i=0; iincReferenceCount(); @@ -234,7 +233,7 @@ namespace epics { namespace pvData { } - void BaseStructureArray::toString(StringPtr buffer,int indentLevel) const { + void BaseStructureArray::toString(StringBuilder buffer,int indentLevel) const { BaseField::toString(buffer,indentLevel); *buffer += " structure "; pstructure->toString(buffer,indentLevel + 1); @@ -242,7 +241,7 @@ namespace epics { namespace pvData { FieldCreate::FieldCreate(){}; - ScalarConstPtr FieldCreate::createScalar(StringConstPtr fieldName, + ScalarConstPtr FieldCreate::createScalar(StringConst fieldName, ScalarType scalarType) const { BaseScalar *baseScalar = new BaseScalar(fieldName,scalarType); @@ -250,13 +249,13 @@ namespace epics { namespace pvData { } ScalarArrayConstPtr FieldCreate::createScalarArray( - StringConstPtr fieldName,ScalarType elementType) const + StringConst fieldName,ScalarType elementType) const { BaseScalarArray *baseScalarArray = new BaseScalarArray(fieldName,elementType); return baseScalarArray; } StructureConstPtr FieldCreate::createStructure ( - StringConstPtr fieldName,int numberFields, + StringConst fieldName,int numberFields, FieldConstPtr fields[]) const { BaseStructure *baseStructure = new BaseStructure( @@ -264,13 +263,13 @@ namespace epics { namespace pvData { return baseStructure; } StructureArrayConstPtr FieldCreate::createStructureArray( - StringConstPtr fieldName,StructureConstPtr structure) const + StringConst fieldName,StructureConstPtr structure) const { BaseStructureArray *baseStructureArray = new BaseStructureArray(fieldName,structure); return baseStructureArray; } - FieldConstPtr FieldCreate::create(StringConstPtr fieldName, + FieldConstPtr FieldCreate::create(StringConst fieldName, FieldConstPtr pfield) const { Type type = pfield->getType(); @@ -292,8 +291,8 @@ namespace epics { namespace pvData { return createStructureArray(fieldName,pstructureArray->getStructure()); } } - std::string message("field "); - message += *fieldName; + String message("field "); + message += fieldName; throw std::logic_error(message); } @@ -306,10 +305,10 @@ namespace epics { namespace pvData { }; FieldCreate * getFieldCreate() { - static epicsMutex *lock = new epicsMutex(); - lock->lock(); + static Mutex *mutex = new Mutex(); + Lock xx(mutex); + if(instance==0) instance = new FieldCreateExt(); - lock->unlock(); return instance; } diff --git a/pvDataApp/factory/PVAuxInfoImpl.cpp b/pvDataApp/factory/PVAuxInfoImpl.cpp index ce330f2..759540c 100644 --- a/pvDataApp/factory/PVAuxInfoImpl.cpp +++ b/pvDataApp/factory/PVAuxInfoImpl.cpp @@ -3,6 +3,7 @@ #include #include #include +#include "noDefaultMethods.h" #include "pvData.h" #include "factory.h" @@ -14,10 +15,10 @@ namespace epics { namespace pvData { public: PVAuxInfoPvt(PVField *pvField) : pvField(pvField), - theMap(std::map()) + theMap(std::map()) {} PVField *pvField; - std::map theMap; + std::map theMap; }; PVAuxInfo::PVAuxInfo(PVField *pvField) @@ -34,49 +35,49 @@ namespace epics { namespace pvData { return pImpl->pvField; } - typedef std::map::const_iterator map_iterator; + typedef std::map::const_iterator map_iterator; - PVScalar * PVAuxInfo::createInfo(StringConstPtr key,ScalarType scalarType) + PVScalar * PVAuxInfo::createInfo(StringConst key,ScalarType scalarType) { map_iterator i = pImpl->theMap.find(key); if(i!=pImpl->theMap.end()) { - std::string message("AuxoInfo:create key "); - message += key->c_str(); + String message("AuxoInfo:create key "); + message += key.c_str(); message += " already exists with scalarType "; ScalarTypeFunc::toString(&message,scalarType); - pImpl->pvField->message(&message,errorMessage); + pImpl->pvField->message(message,errorMessage); } PVScalar *pvScalar = pvDataCreate->createPVScalar(0,key,scalarType); - pImpl->theMap.insert(std::pair(key, pvScalar)); + pImpl->theMap.insert(std::pair(key, pvScalar)); return pvScalar; } - std::map *PVAuxInfo::getInfos() + std::map *PVAuxInfo::getInfos() { return &pImpl->theMap; } - PVScalar * PVAuxInfo::getInfo(StringConstPtr key) + PVScalar * PVAuxInfo::getInfo(StringConst key) { map_iterator i = pImpl->theMap.find(key); if(i!=pImpl->theMap.end()) return i->second; return 0; } - void PVAuxInfo::toString(StringPtr buf) + void PVAuxInfo::toString(StringBuilder buf) { return PVAuxInfo::toString(buf,0); } - void PVAuxInfo::toString(StringPtr buf,int indentLevel) + void PVAuxInfo::toString(StringBuilder buf,int indentLevel) { map_iterator i = pImpl->theMap.begin(); while(i!=pImpl->theMap.end()) { - StringConstPtr key = i->first; + StringConst key = i->first; PVScalar *value = i->second; *buf += " "; - *buf += key->c_str(); + *buf += key.c_str(); *buf += " "; value->toString(buf); } diff --git a/pvDataApp/factory/PVDataCreateFactory.cpp b/pvDataApp/factory/PVDataCreateFactory.cpp index 2fabf6f..764994d 100644 --- a/pvDataApp/factory/PVDataCreateFactory.cpp +++ b/pvDataApp/factory/PVDataCreateFactory.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include #include "pvData.h" #include "convert.h" #include "factory.h" @@ -40,12 +40,12 @@ namespace epics { namespace pvData { return createPVStructureArray(parent, (StructureArrayConstPtr)field); } - std::string message("PVDataCreate::createPVField"); + String message("PVDataCreate::createPVField"); throw std::invalid_argument(message); }; PVField *PVDataCreate::createPVField(PVStructure *parent, - StringConstPtr fieldName,PVField * fieldToClone) + StringConst fieldName,PVField * fieldToClone) { switch(fieldToClone->getField()->getType()) { case scalar: @@ -57,11 +57,11 @@ namespace epics { namespace pvData { return (PVField *)createPVStructure(parent,fieldName, (PVStructure *)fieldToClone); case structureArray: - std::string message( + String message( "PVDataCreate::createPVField structureArray not valid fieldToClone"); throw std::invalid_argument(message); } - std::string message("PVDataCreate::createPVField"); + String message("PVDataCreate::createPVField"); throw std::logic_error(message); }; @@ -78,7 +78,7 @@ namespace epics { namespace pvData { }; PVScalar *PVDataCreate::createPVScalar(PVStructure *parent, - StringConstPtr fieldName,ScalarType scalarType) + StringConst fieldName,ScalarType scalarType) { if(fieldCreate==0) fieldCreate = getFieldCreate(); ScalarConstPtr scalar = fieldCreate->createScalar(fieldName,scalarType); @@ -86,7 +86,7 @@ namespace epics { namespace pvData { }; PVScalar *PVDataCreate::createPVScalar(PVStructure *parent, - StringConstPtr fieldName,PVScalar * scalarToClone) + StringConst fieldName,PVScalar * scalarToClone) { PVScalar *pvScalar = createPVScalar(parent,fieldName, scalarToClone->getScalar()->getScalarType()); @@ -114,13 +114,13 @@ namespace epics { namespace pvData { }; PVScalarArray *PVDataCreate::createPVScalarArray(PVStructure *parent, - StringConstPtr fieldName,ScalarType elementType) + StringConst fieldName,ScalarType elementType) { throw std::logic_error(notImplemented); }; PVScalarArray *PVDataCreate::createPVScalarArray(PVStructure *parent, - StringConstPtr fieldName,PVScalarArray * scalarArrayToClone) + StringConst fieldName,PVScalarArray * scalarArrayToClone) { throw std::logic_error(notImplemented); }; @@ -138,13 +138,13 @@ namespace epics { namespace pvData { }; PVStructure *PVDataCreate::createPVStructure(PVStructure *parent, - StringConstPtr fieldName,FieldConstPtrArray fields) + StringConst fieldName,FieldConstPtrArray fields) { throw std::logic_error(notImplemented); }; PVStructure *PVDataCreate::createPVStructure(PVStructure *parent, - StringConstPtr fieldName,PVStructure *structToClone) + StringConst fieldName,PVStructure *structToClone) { throw std::logic_error(notImplemented); }; @@ -156,10 +156,10 @@ namespace epics { namespace pvData { }; PVDataCreate * getPVDataCreate() { - static epicsMutex *lock = new epicsMutex(); - lock->lock(); - if(pvDataCreate==0) pvDataCreate = new PVDataCreateExt(); - lock->unlock(); + static Mutex *mutex = new Mutex(); + Lock xx(mutex); + + if(pvDataCreate==0) pvDataCreate = new PVDataCreateExt(); return pvDataCreate; } diff --git a/pvDataApp/factory/TypeFunc.cpp b/pvDataApp/factory/TypeFunc.cpp index e1903d4..28fd874 100644 --- a/pvDataApp/factory/TypeFunc.cpp +++ b/pvDataApp/factory/TypeFunc.cpp @@ -8,8 +8,8 @@ namespace epics { namespace pvData { - void TypeFunc::toString(StringPtr buf,const Type type) { - static const std::string unknownString = "logic error unknown Type"; + void TypeFunc::toString(StringBuilder buf,const Type type) { + static StringConst unknownString = "logic error unknown Type"; switch(type) { case scalar : *buf += "scalar"; break; case scalarArray : *buf += "scalarArray"; break; @@ -36,20 +36,20 @@ namespace epics { namespace pvData { return false; } - ScalarType ScalarTypeFunc::getScalarType(StringConstPtr pvalue) { - static const std::string unknownString = "error unknown ScalarType"; - if(pvalue->compare("boolean")==0) return pvBoolean; - if(pvalue->compare("byte")==0) return pvByte; - if(pvalue->compare("short")==0) return pvShort; - if(pvalue->compare("int")==0) return pvInt; - if(pvalue->compare("long")==0) return pvLong; - if(pvalue->compare("float")==0) return pvFloat; - if(pvalue->compare("double")==0) return pvDouble; - if(pvalue->compare("string")==0) return pvString; + ScalarType ScalarTypeFunc::getScalarType(StringConst pvalue) { + static StringConst unknownString = "error unknown ScalarType"; + if(pvalue.compare("boolean")==0) return pvBoolean; + if(pvalue.compare("byte")==0) return pvByte; + if(pvalue.compare("short")==0) return pvShort; + if(pvalue.compare("int")==0) return pvInt; + if(pvalue.compare("long")==0) return pvLong; + if(pvalue.compare("float")==0) return pvFloat; + if(pvalue.compare("double")==0) return pvDouble; + if(pvalue.compare("string")==0) return pvString; throw std::invalid_argument(unknownString); } - void ScalarTypeFunc::toString(StringPtr buf,const ScalarType scalarType) { - static const std::string unknownString = "logic error unknown ScalarType"; + void ScalarTypeFunc::toString(StringBuilder buf,const ScalarType scalarType) { + static StringConst unknownString = "logic error unknown ScalarType"; switch(scalarType) { case pvBoolean : *buf += "pvBoolean"; return; case pvByte : *buf += "pvByte"; return;; diff --git a/pvDataApp/factory/factory.h b/pvDataApp/factory/factory.h index 0c1f4d8..a9e9420 100644 --- a/pvDataApp/factory/factory.h +++ b/pvDataApp/factory/factory.h @@ -6,7 +6,5 @@ namespace epics { namespace pvData { enum DebugLevel{noDebug,lowDebug,highDebug}; - static DebugLevel debugLevel = highDebug; - }} #endif /*FACTORY_H */ diff --git a/pvDataApp/misc/Makefile b/pvDataApp/misc/Makefile index d5bec0b..c95263f 100644 --- a/pvDataApp/misc/Makefile +++ b/pvDataApp/misc/Makefile @@ -2,6 +2,8 @@ TOP=../.. include $(TOP)/configure/CONFIG +INC += noDefaultMethods.h +INC += lock.h INC += requester.h INC += serialize.h INC += bitSet.h diff --git a/pvDataApp/misc/bitSet.h b/pvDataApp/misc/bitSet.h index 381f857..02b6495 100644 --- a/pvDataApp/misc/bitSet.h +++ b/pvDataApp/misc/bitSet.h @@ -1,7 +1,6 @@ /* bitSet.h */ #ifndef BITSET_H #define BITSET_H -#include "pvIntrospect.h" namespace epics { namespace pvData { class BitSet; diff --git a/pvDataApp/misc/byteBuffer.h b/pvDataApp/misc/byteBuffer.h index 9c8bd47..99a99bd 100644 --- a/pvDataApp/misc/byteBuffer.h +++ b/pvDataApp/misc/byteBuffer.h @@ -3,7 +3,6 @@ #ifndef BYTEBUFFER_H #define BYTEBUFFER_H #include "epicsTypes.h" -#include "pvIntrospect.h" namespace epics { namespace pvData { // not sure why I have to define epicsInt64 @@ -21,7 +20,7 @@ class ByteBuffer { virtual epicsInt64 getLong() const = 0; virtual float getFloat() const = 0; virtual double getDouble() const = 0; - virtual StringConstPtr getString() const = 0; + virtual StringConst getString() const = 0; virtual ByteBuffer * putBoolean(epicsBoolean value) const = 0; virtual ByteBuffer * putByte(epicsInt8 value) const = 0; virtual ByteBuffer * geShort(epicsInt16 value) const = 0; @@ -29,7 +28,7 @@ class ByteBuffer { virtual ByteBuffer * putLong(epicsInt64 value) const = 0; virtual ByteBuffer * putFloat(float value) const = 0; virtual ByteBuffer * putDouble(double value) const = 0; - virtual ByteBuffer * putString(StringConstPtr value) const = 0; + virtual ByteBuffer * putString(StringConst value) const = 0; // Must define arrays }; diff --git a/pvDataApp/misc/lock.h b/pvDataApp/misc/lock.h new file mode 100644 index 0000000..2dc7162 --- /dev/null +++ b/pvDataApp/misc/lock.h @@ -0,0 +1,32 @@ +/* lock.h */ +#ifndef LOCK_H +#define LOCK_H +#include +#include "noDefaultMethods.h" +/* This is based on item 14 of + * Effective C++, Third Edition, Scott Meyers + */ + +namespace epics { namespace pvData { + + class Mutex { + public: + Mutex() : lockPtr(new epicsMutex()){} + ~Mutex() { delete lockPtr;}; + void lock(){lockPtr->lock();}\ + void unlock(){lockPtr->unlock();} + private: + epicsMutex *lockPtr; + }; + + class Lock : private NoDefaultMethods { + public: + explicit Lock(Mutex *pm) + : mutexPtr(pm) + {mutexPtr->lock();} + ~Lock(){mutexPtr->unlock();} + private: + Mutex *mutexPtr; + }; +}} +#endif /* LOCK_H */ diff --git a/pvDataApp/misc/noDefaultMethods.h b/pvDataApp/misc/noDefaultMethods.h new file mode 100644 index 0000000..6ef3102 --- /dev/null +++ b/pvDataApp/misc/noDefaultMethods.h @@ -0,0 +1,22 @@ +/* noDefaultMethods.h */ +#ifndef NO_DEFAULT_METHODS_H +#define NO_DEFAULT_METHODS_H +namespace epics { namespace pvData { +/* This is based on Item 6 of + * Effective C++, Third Edition, Scott Meyers + */ + + + class NoDefaultMethods { + protected: + // allow by derived objects + NoDefaultMethods(){}; + ~NoDefaultMethods(){} + private: + // do not implment + NoDefaultMethods(const NoDefaultMethods&); + NoDefaultMethods & operator=(const NoDefaultMethods &); + }; + +}} +#endif /* NO_DEFAULT_METHODS_H */ diff --git a/pvDataApp/misc/requester.h b/pvDataApp/misc/requester.h index ea105e4..9afd615 100644 --- a/pvDataApp/misc/requester.h +++ b/pvDataApp/misc/requester.h @@ -2,7 +2,6 @@ #include #ifndef REQUESTER_H #define REQUESTER_H -#include "pvIntrospect.h" namespace epics { namespace pvData { enum MessageType {infoMessage,warningMessage,errorMessage,fatalErrorMessage}; @@ -11,8 +10,8 @@ namespace epics { namespace pvData { class Requester { public: - virtual StringConstPtr getRequesterName() const = 0; - virtual void message(StringConstPtr message,MessageType messageType) const = 0; + virtual StringConst getRequesterName() const = 0; + virtual void message(StringConst message,MessageType messageType) const = 0; }; }} #endif /* REQUESTER_H */ diff --git a/pvDataApp/pv/convert.h b/pvDataApp/pv/convert.h index 7cee9e6..d70e088 100644 --- a/pvDataApp/pv/convert.h +++ b/pvDataApp/pv/convert.h @@ -12,15 +12,15 @@ namespace epics { namespace pvData { public: Convert(); ~Convert(); - void getFullName(StringConstPtr buf,PVField const *pvField); - void getString(StringPtr buf,PVField const * pvField,int indentLevel); - void getString(StringPtr buf,PVField const * pvField); - void fromString(PVScalar *pv, StringConstPtr from); - int fromString(PVScalarArray *pv, StringConstPtr from); + void getFullName(StringConst buf,PVField const *pvField); + void getString(StringBuilder buf,PVField const * pvField,int indentLevel); + void getString(StringBuilder buf,PVField const * pvField); + void fromString(PVScalar *pv, StringConst from); + int fromString(PVScalarArray *pv, StringConst from); int fromStringArray(PVScalarArray *pv, int offset, int length, - StringPtrArray from, int fromOffset); + StringConstArray from, int fromOffset); int toStringArray(PVScalarArray const *pv, int offset, int length, - StringPtrArray to, int fromOffset); + StringConstArray to, int fromOffset); epicsBoolean isCopyCompatible(FieldConstPtr from, FieldConstPtr to); void copy(PVField const *from,PVField *to); epicsBoolean isCopyScalarCompatible( @@ -73,7 +73,7 @@ namespace epics { namespace pvData { float from[], int fromOffset); int fromDoubleArray(PVScalarArray *pv, int offset, int length, double from[], int fromOffset); - void newLine(StringPtr buf, int indentLevel); + void newLine(StringBuilder buf, int indentLevel); private: Convert(Convert const & ); // not implemented diff --git a/pvDataApp/pv/pvData.h b/pvDataApp/pv/pvData.h index 2889a89..e5b8c9e 100644 --- a/pvDataApp/pv/pvData.h +++ b/pvDataApp/pv/pvData.h @@ -5,6 +5,7 @@ #ifndef PVDATA_H #define PVDATA_H #include "pvIntrospect.h" +#include "noDefaultMethods.h" #include "requester.h" #include "byteBuffer.h" #include "serialize.h" @@ -34,21 +35,20 @@ namespace epics { namespace pvData { class PVStructure; class PVStructureArray; - class PVAuxInfo { + // NOTE this prevents compiler from generating default methods for this and + // derived classes + class PVAuxInfo : private NoDefaultMethods { public: PVAuxInfo(PVField *pvField); ~PVAuxInfo(); PVField * getPVField(); - PVScalar * createInfo(StringConstPtr key,ScalarType scalarType); - std::map *getInfos(); - PVScalar * getInfo(StringConstPtr key); - void toString(StringPtr buf); - void toString(StringPtr buf,int indentLevel); + PVScalar * createInfo(StringConst key,ScalarType scalarType); + std::map *getInfos(); + PVScalar * getInfo(StringConst key); + void toString(StringBuilder buf); + void toString(StringBuilder buf,int indentLevel); private: static void init(); - PVAuxInfo(); // not implemented - PVAuxInfo(PVAuxInfo const & ); // not implemented - PVAuxInfo & operator=(PVAuxInfo const &); //not implemented class PVAuxInfoPvt *pImpl; }; @@ -56,11 +56,11 @@ namespace epics { namespace pvData { virtual void postPut() = 0; }; - class PVField : public Requester, public Serializable { + class PVField : public Requester, public Serializable ,private NoDefaultMethods{ public: virtual ~PVField(); - StringConstPtr getRequesterName() const; - virtual void message(StringConstPtr message,MessageType messageType) const; + StringConst getRequesterName() const; + virtual void message(StringConst message,MessageType messageType) const; virtual void setRequester(Requester *prequester); int getFieldOffset() const; int getNextFieldOffset() const; @@ -71,18 +71,15 @@ namespace epics { namespace pvData { FieldConstPtr getField() const; PVStructure * getParent() const; void replacePVField(PVField * newPVField); - void renameField(StringConstPtr newName); + void renameField(StringConst newName); void postPut() const; void setPostHandler(PostHandler *postHandler); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; protected: PVField(PVStructure *parent,FieldConstPtr field); void replaceStructure(); private: - PVField();//not implemented - PVField(PVField const & ); // not implemented - PVField & operator=(PVField const &); //not implemented class PVFieldPvt *pImpl; static void computeOffset(const PVField * const pvField); static void computeOffset(const PVField * const pvField,int offset); @@ -92,14 +89,10 @@ namespace epics { namespace pvData { public: virtual ~PVScalar(); ScalarConstPtr getScalar() const; - virtual void toString(StringPtr buf) const = 0; - virtual void toString(StringPtr buf,int indentLevel) const = 0; + virtual void toString(StringBuilder buf) const = 0; + virtual void toString(StringBuilder buf,int indentLevel) const = 0; protected: PVScalar(PVStructure *parent,ScalarConstPtr scalar); - private: - PVScalar(); // not implemented - PVScalar(PVScalar const & ); // not implemented - PVScalar & operator=(PVScalar const &); //not implemented }; class PVArray : public PVField, public SerializableArray { @@ -117,14 +110,11 @@ namespace epics { namespace pvData { DeserializableControl *pflusher) = 0; virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, int offset, int count) const = 0; - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const = 0; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const = 0; protected: PVArray(PVStructure *parent,FieldConstPtr field); private: - PVArray(); // not implemented - PVArray(PVArray const & ); // not implemented - PVArray & operator=(PVArray const &); //not implemented class PVArrayPvt *pImpl; }; @@ -140,14 +130,11 @@ namespace epics { namespace pvData { DeserializableControl *pflusher) = 0; virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, int offset, int count) const = 0; - virtual void toString(StringPtr buf) const = 0; - virtual void toString(StringPtr buf,int indentLevel) const = 0; + virtual void toString(StringBuilder buf) const = 0; + virtual void toString(StringBuilder buf,int indentLevel) const = 0; protected: PVScalarArray(PVStructure *parent,ScalarArrayConstPtr scalarArray); private: - PVScalarArray(); // not implemented - PVScalarArray(PVScalarArray const & ); // not implemented - PVScalarArray & operator=(PVScalarArray const &); //not implemented }; typedef PVStructure * PVStructurePtr; @@ -174,8 +161,8 @@ namespace epics { namespace pvData { DeserializableControl *pflusher); virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, int offset, int count) const; - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; protected: PVStructureArray(PVStructure *parent, StructureArrayConstPtr structureArray); @@ -189,33 +176,33 @@ namespace epics { namespace pvData { typedef PVField * PVFieldPtr; typedef PVFieldPtr * PVFieldArrayPtr; - class PVStructure : public PVField, public BitSetSerializable { + class PVStructure : public PVField,public BitSetSerializable { public: virtual ~PVStructure(); StructureConstPtr getStructure(); PVFieldArrayPtr getPVFields(); - PVFieldPtr getSubField(StringConstPtr fieldName); + PVFieldPtr getSubField(StringConst fieldName); PVFieldPtr getSubField(int fieldOffset); void appendPVField(PVField * pvField); void appendPVFields(PVFieldArrayPtr pvFields); - void removePVField(StringConstPtr fieldName); - PVBoolean *getBooleanField(StringConstPtr fieldName); - PVByte *getByteField(StringConstPtr fieldName); - PVShort *getShortField(StringConstPtr fieldName); - PVInt *getIntField(StringConstPtr fieldName); - PVLong *getLongField(StringConstPtr fieldName); - PVFloat *getFloatField(StringConstPtr fieldName); - PVDouble *getDoubleField(StringConstPtr fieldName); - PVString *getStringField(StringConstPtr fieldName); - PVStructure *getStructureField(StringConstPtr fieldName); + void removePVField(StringConst fieldName); + PVBoolean *getBooleanField(StringConst fieldName); + PVByte *getByteField(StringConst fieldName); + PVShort *getShortField(StringConst fieldName); + PVInt *getIntField(StringConst fieldName); + PVLong *getLongField(StringConst fieldName); + PVFloat *getFloatField(StringConst fieldName); + PVDouble *getDoubleField(StringConst fieldName); + PVString *getStringField(StringConst fieldName); + PVStructure *getStructureField(StringConst fieldName); PVScalarArray *getScalarArrayField( - StringConstPtr fieldName,ScalarType elementType); - PVStructureArray *getStructureArrayField(StringConstPtr fieldName); - StringConstPtr getExtendsStructureName(); + StringConst fieldName,ScalarType elementType); + PVStructureArray *getStructureArrayField(StringConst fieldName); + StringConst getExtendsStructureName(); epicsBoolean putExtendsStructureName( - StringConstPtr extendsStructureName); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + StringConst extendsStructureName); + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual void serialize( ByteBuffer *pbuffer,SerializableControl *pflusher) const; virtual void deserialize( @@ -229,9 +216,6 @@ namespace epics { namespace pvData { protected: PVStructure(PVStructure *parent,StructureConstPtr structure); private: - PVStructure(); // not implemented - PVStructure(PVStructure const & ); // not implemented - PVStructure& operator=(PVStructure const &); //not implemented class PVStructurePvt *pImpl; }; @@ -244,9 +228,6 @@ namespace epics { namespace pvData { PVBoolean(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVBoolean(); // not implemented - PVBoolean(PVBoolean const & ); // not implemented - PVBoolean & operator=(PVBoolean const &); //not implemented }; class PVByte : public PVScalar { @@ -258,9 +239,6 @@ namespace epics { namespace pvData { PVByte(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVByte(); // not implemented - PVByte(PVByte const & ); // not implemented - PVByte & operator=(PVByte const &); //not implemented }; class PVShort : public PVScalar { @@ -272,12 +250,9 @@ namespace epics { namespace pvData { PVShort(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVShort(); // not implemented - PVShort(PVShort const & ); // not implemented - PVShort & operator=(PVShort const &); //not implemented }; - class PVInt : public PVScalar { + class PVInt : public PVScalar{ public: virtual ~PVInt(); virtual epicsInt32 get() const = 0; @@ -286,9 +261,6 @@ namespace epics { namespace pvData { PVInt(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVInt(); // not implemented - PVInt(PVInt const & ); // not implemented - PVInt & operator=(PVInt const &); //not implemented }; class PVLong : public PVScalar { @@ -300,9 +272,6 @@ namespace epics { namespace pvData { PVLong(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVLong(); // not implemented - PVLong(PVLong const & ); // not implemented - PVLong & operator=(PVLong const &); //not implemented }; class PVFloat : public PVScalar { @@ -314,9 +283,6 @@ namespace epics { namespace pvData { PVFloat(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVFloat(); // not implemented - PVFloat(PVFloat const & ); // not implemented - PVFloat & operator=(PVFloat const &); //not implemented }; class PVDouble : public PVScalar { @@ -328,23 +294,17 @@ namespace epics { namespace pvData { PVDouble(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVDouble(); // not implemented - PVDouble(PVScalar const & ); // not implemented - PVDouble & operator=(PVScalar const &); //not implemented }; class PVString : public PVScalar { public: virtual ~PVString(); - virtual StringConstPtr get() const = 0; - virtual void put(StringConstPtr value) = 0; + virtual StringConst get() const = 0; + virtual void put(StringConst value) = 0; protected: PVString(PVStructure *parent,ScalarConstPtr scalar) : PVScalar(parent,scalar) {} private: - PVString(); // not implemented - PVString(PVString const & ); // not implemented - PVString & operator=(PVString const &); //not implemented }; typedef epicsBoolean * EpicsBooleanArrayPtr; @@ -358,8 +318,8 @@ namespace epics { namespace pvData { class PVBooleanArray : public PVScalarArray { public: virtual ~PVBooleanArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, BooleanArrayData *data) const; virtual int put(int offset,int length, EpicsBooleanArrayPtr from, int fromOffset); virtual void shareData(EpicsBooleanArrayPtr from); @@ -368,9 +328,6 @@ namespace epics { namespace pvData { protected: PVBooleanArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVBooleanArray(); // not implemented - PVBooleanArray(PVBooleanArray const & ); // not implemented - PVBooleanArray & operator=(PVBooleanArray const &); //not implemented }; typedef signed char * ByteArrayPtr; @@ -384,8 +341,8 @@ namespace epics { namespace pvData { class PVByteArray : public PVScalarArray { public: virtual ~PVByteArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, ByteArrayData *data) const; virtual int put(int offset,int length, ByteArrayPtr from, int fromOffset); virtual void shareData(ByteArrayPtr from); @@ -394,9 +351,6 @@ namespace epics { namespace pvData { protected: PVByteArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVByteArray(); // not implemented - PVByteArray(PVByteArray const & ); // not implemented - PVByteArray & operator=(PVByteArray const &); //not implemented }; typedef short * ShortArrayPtr; @@ -410,8 +364,8 @@ namespace epics { namespace pvData { class PVShortArray : public PVScalarArray { public: virtual ~PVShortArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, ShortArrayData *data) const; virtual int put(int offset,int length, ShortArrayPtr from, int fromOffset); virtual void shareData(ShortArrayPtr from); @@ -420,9 +374,6 @@ namespace epics { namespace pvData { protected: PVShortArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVShortArray(); // not implemented - PVShortArray(PVShortArray const & ); // not implemented - PVShortArray & operator=(PVShortArray const &); //not implemented }; typedef int * IntArrayPtr; @@ -436,8 +387,8 @@ namespace epics { namespace pvData { class PVIntArray : public PVScalarArray { public: virtual ~PVIntArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, IntArrayData *data) const; virtual int put(int offset,int length, IntArrayPtr from, int fromOffset); virtual void shareData(IntArrayPtr from); @@ -446,9 +397,6 @@ namespace epics { namespace pvData { protected: PVIntArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVIntArray(); // not implemented - PVIntArray(PVIntArray const & ); // not implemented - PVIntArray & operator=(PVIntArray const &); //not implemented }; typedef long * LongArrayPtr; @@ -462,8 +410,8 @@ namespace epics { namespace pvData { class PVLongArray : public PVScalarArray { public: virtual ~PVLongArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, LongArrayData *data) const; virtual int put(int offset,int length, LongArrayPtr from, int fromOffset); virtual void shareData(LongArrayPtr from); @@ -472,9 +420,6 @@ namespace epics { namespace pvData { protected: PVLongArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVLongArray(); // not implemented - PVLongArray(PVLongArray const & ); // not implemented - PVLongArray & operator=(PVLongArray const &); //not implemented }; @@ -489,8 +434,8 @@ namespace epics { namespace pvData { class PVFloatArray : public PVScalarArray { public: virtual ~PVFloatArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, FloatArrayData *data) const; virtual int put(int offset,int length, FloatArrayPtr from, int fromOffset); virtual void shareData(FloatArrayPtr from); @@ -499,9 +444,6 @@ namespace epics { namespace pvData { protected: PVFloatArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVFloatArray(); // not implemented - PVFloatArray(PVFloatArray const & ); // not implemented - PVFloatArray & operator=(PVFloatArray const &); //not implemented }; typedef double * DoubleArrayPtr; @@ -515,8 +457,8 @@ namespace epics { namespace pvData { class PVDoubleArray : public PVScalarArray { public: virtual ~PVDoubleArray(); - virtual void toString(StringPtr buf) const = 0; - virtual void toString(StringPtr buf,int indentLevel) const = 0; + virtual void toString(StringBuilder buf) const = 0; + virtual void toString(StringBuilder buf,int indentLevel) const = 0; virtual int get(int offset, int length, DoubleArrayData *data) const = 0; virtual int put(int offset,int length, DoubleArrayPtr from, int fromOffset) = 0; virtual void shareData(DoubleArrayPtr from) = 0; @@ -525,9 +467,6 @@ namespace epics { namespace pvData { protected: PVDoubleArray(PVStructure *parent,ScalarArrayConstPtr scalar); private: - PVDoubleArray(); // not implemented - PVDoubleArray(PVDoubleArray const & ); // not implemented - PVDoubleArray & operator=(PVDoubleArray const &); //not implemented }; typedef std::string * StringArrayPtr; @@ -541,8 +480,8 @@ namespace epics { namespace pvData { class PVStringArray : public PVScalarArray { public: virtual ~PVStringArray(); - virtual void toString(StringPtr buf) const; - virtual void toString(StringPtr buf,int indentLevel) const; + virtual void toString(StringBuilder buf) const; + virtual void toString(StringBuilder buf,int indentLevel) const; virtual int get(int offset, int length, StringArrayData *data) const; virtual int put(int offset,int length, StringArrayPtr from, int fromOffset); virtual void shareData(StringArrayPtr from); @@ -551,9 +490,6 @@ namespace epics { namespace pvData { protected: PVStringArray(PVStructure *parent,ScalarConstPtr scalar); private: - PVStringArray(); // not implemented - PVStringArray(PVStringArray const & ); // not implemented - PVStringArray & operator=(PVStringArray const &); //not implemented }; class PVDataCreate { @@ -561,26 +497,26 @@ namespace epics { namespace pvData { PVField *createPVField(PVStructure *parent, FieldConstPtr field); PVField *createPVField(PVStructure *parent, - StringConstPtr fieldName,PVField * fieldToClone); + StringConst fieldName,PVField * fieldToClone); PVScalar *createPVScalar(PVStructure *parent,ScalarConstPtr scalar); PVScalar *createPVScalar(PVStructure *parent, - StringConstPtr fieldName,ScalarType scalarType); + StringConst fieldName,ScalarType scalarType); PVScalar *createPVScalar(PVStructure *parent, - StringConstPtr fieldName,PVScalar * scalarToClone); + StringConst fieldName,PVScalar * scalarToClone); PVScalarArray *createPVScalarArray(PVStructure *parent, ScalarArrayConstPtr scalarArray); PVScalarArray *createPVScalarArray(PVStructure *parent, - StringConstPtr fieldName,ScalarType elementType); + StringConst fieldName,ScalarType elementType); PVScalarArray *createPVScalarArray(PVStructure *parent, - StringConstPtr fieldName,PVScalarArray * scalarArrayToClone); + StringConst fieldName,PVScalarArray * scalarArrayToClone); PVStructureArray *createPVStructureArray(PVStructure *parent, StructureArrayConstPtr structureArray); PVStructure *createPVStructure(PVStructure *parent, StructureConstPtr structure); PVStructure *createPVStructure(PVStructure *parent, - StringConstPtr fieldName,FieldConstPtrArray fields); + StringConst fieldName,FieldConstPtrArray fields); PVStructure *createPVStructure(PVStructure *parent, - StringConstPtr fieldName,PVStructure *structToClone); + StringConst fieldName,PVStructure *structToClone); protected: PVDataCreate(); }; diff --git a/pvDataApp/pv/pvIntrospect.h b/pvDataApp/pv/pvIntrospect.h index 7903603..79a6e9e 100644 --- a/pvDataApp/pv/pvIntrospect.h +++ b/pvDataApp/pv/pvIntrospect.h @@ -3,6 +3,7 @@ #include #ifndef PVINTROSPECT_H #define PVINTROSPECT_H +#include "noDefaultMethods.h" namespace epics { namespace pvData { class Field; class Scalar; @@ -10,12 +11,10 @@ namespace epics { namespace pvData { class Structure; class StructureArray; - typedef std::string * StringPtr; - typedef StringPtr * StringPtrArray; - // pointer to constant string - typedef std::string const * StringConstPtr; - //array of pointers to constant string - typedef StringConstPtr * StringConstPtrArray; + typedef std::string String; + typedef std::string * StringBuilder; + typedef std::string const StringConst; + typedef StringConst * StringConstArray; typedef Field const * FieldConstPtr; typedef FieldConstPtr * FieldConstPtrArray; @@ -33,7 +32,7 @@ namespace epics { namespace pvData { class TypeFunc { public: - static void toString(StringPtr buf,const Type type); + static void toString(StringBuilder buf,const Type type); }; enum ScalarType { @@ -52,20 +51,24 @@ namespace epics { namespace pvData { static bool isInteger(ScalarType type); static bool isNumeric(ScalarType type); static bool isPrimitive(ScalarType type); - static ScalarType getScalarType(StringConstPtr value); - static void toString(StringPtr buf,const ScalarType scalarType); + static ScalarType getScalarType(StringConst value); + static void toString(StringBuilder buf,const ScalarType scalarType); }; - class Field { + class Field : private NoDefaultMethods { public: virtual ~Field(); + virtual int getReferenceCount() const = 0; + virtual StringConst getFieldName() const = 0; + virtual Type getType() const = 0; + virtual void toString(StringBuilder buf) const = 0; + virtual void toString(StringBuilder buf,int indentLevel) const = 0; + private: virtual void incReferenceCount() const = 0; virtual void decReferenceCount() const = 0; - virtual int getReferenceCount() const = 0; - virtual StringConstPtr getFieldName() const = 0; - virtual Type getType() const = 0; - virtual void toString(StringPtr buf) const = 0; - virtual void toString(StringPtr buf,int indentLevel) const = 0; + friend class BaseStructure; + friend class BaseStructureArray; + friend class PVFieldPvt; }; @@ -86,8 +89,8 @@ namespace epics { namespace pvData { public: virtual ~Structure(); virtual int const getNumberFields() const = 0; - virtual FieldConstPtr getField(StringConstPtr fieldName) const = 0; - virtual int getFieldIndex(StringConstPtr fieldName) const = 0; + virtual FieldConstPtr getField(StringConst fieldName) const = 0; + virtual int getFieldIndex(StringConst fieldName) const = 0; virtual FieldConstPtrArray getFields() const = 0; }; @@ -100,13 +103,13 @@ namespace epics { namespace pvData { class FieldCreate { public: - FieldConstPtr create(StringConstPtr fieldName,FieldConstPtr field) const; - ScalarConstPtr createScalar(StringConstPtr fieldName,ScalarType scalarType) const; - ScalarArrayConstPtr createScalarArray(StringConstPtr fieldName, + FieldConstPtr create(StringConst fieldName,FieldConstPtr field) const; + ScalarConstPtr createScalar(StringConst fieldName,ScalarType scalarType) const; + ScalarArrayConstPtr createScalarArray(StringConst fieldName, ScalarType elementType) const; - StructureConstPtr createStructure (StringConstPtr fieldName, + StructureConstPtr createStructure (StringConst fieldName, int numberFields,FieldConstPtrArray fields) const; - StructureArrayConstPtr createStructureArray(StringConstPtr fieldName, + StructureArrayConstPtr createStructureArray(StringConst fieldName, StructureConstPtr structure) const; protected: FieldCreate(); diff --git a/pvDataApp/test/Makefile b/pvDataApp/test/Makefile index b1ecd3d..fbb52d1 100644 --- a/pvDataApp/test/Makefile +++ b/pvDataApp/test/Makefile @@ -6,10 +6,6 @@ PROD_HOST += testIntrospect testIntrospect_SRCS += testIntrospect.cpp testIntrospect_LIBS += pvFactory -PROD_HOST += testDumpStdString -testDumpStdString_SRCS += testDumpStdString.cpp -testDumpStdString_LIBS += pvFactory - PROD_HOST += testPVAuxInfo testPVAuxInfo_SRCS += testPVAuxInfo.cpp testPVAuxInfo_LIBS += pvFactory diff --git a/pvDataApp/test/testDumpStdString.cpp b/pvDataApp/test/testDumpStdString.cpp deleted file mode 100644 index 6870fa7..0000000 --- a/pvDataApp/test/testDumpStdString.cpp +++ /dev/null @@ -1,116 +0,0 @@ -/* pvDataMain.cpp */ -/* Author: Marty Kraimer Date: 17MAR2000 */ - -#include -#include -#include -#include -#include - -#include "pvIntrospect.h" - -using namespace epics::pvData; -using namespace std; - -static void dumpString(char const prefix[],string const* value) { - printf("%s\n value %p",prefix,value); - // Just convert value to a pointer - int *pvalue = (int *)value; - // Now get what pvalue points to. It is the cstr. - char * cstr = (char *)*pvalue; - if(cstr==0) { printf("\n"); return; } - printf(" *value %p",cstr); - int * stuff = (int *)*pvalue; - //At least on my implementation the following is true - stuff -= 3; - printf(" length %d capacity %d refcount %d str %s\n", - stuff[0],stuff[1],stuff[2],cstr); -} - -int main(int argc,char *argv[]) -{ - FieldCreate * pfieldCreate = getFieldCreate(); - std::string valueName("value"); - std::string* myString= new std::string("type "); - int numberFields = 2; - FieldConstPtr fields[numberFields]; - std::string name0("high"); - std::string name1("low"); - dumpString("high",&name0); - dumpString("low",&name1); - printf("\ncreate field0 and field1\n"); - fields[0] = pfieldCreate->createScalar(&name0,pvDouble); - fields[1] = pfieldCreate->createScalar(&name1,pvDouble); - printf("referenceCounts field0 %d field1 %d\n", - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - dumpString("high",&name0); - dumpString("low",&name1); - printf("\ncreate scalarArray"); - std::string scalarArrayName("scalarArray"); - ScalarArrayConstPtr pscalarArray = pfieldCreate->createScalarArray( - &scalarArrayName,pvDouble); - myString->clear(); - pscalarArray->toString(myString); - printf("%s\n",myString->c_str()); - printf("referenceCount pscalarArray %d\n", pscalarArray->getReferenceCount()); - dumpString("scalarArray",&scalarArrayName); - pscalarArray->incReferenceCount(); - printf("after incReferenceCounnt referenceCount pscalarArray %d\n", - pscalarArray->getReferenceCount()); - dumpString("high",&name0); - pscalarArray->decReferenceCount(); - dumpString("after decReferenceCount scalarArray",&scalarArrayName); - - printf("\ncreate structure\n"); - StructureConstPtr pstructure = pfieldCreate->createStructure( - &valueName,numberFields,fields); - myString->clear(); - pstructure->toString(myString); - printf("%s\n",myString->c_str()); - FieldConstPtr pfield = pstructure; - myString->clear(); - pfield->toString(myString); - printf("as Field\n%s\n",myString->c_str()); - printf("referenceCounts pfield %d field0 %d field1 %d\n", - pfield->getReferenceCount(), - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - dumpString("high",&name0); - dumpString("low",&name1); - pfield->incReferenceCount(); - pfield->incReferenceCount(); - printf("after incReferenceCounter twice referenceCounts pfield %d field0 %d field1 %d\n", - pfield->getReferenceCount(), - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - dumpString("high",&name0); - dumpString("low",&name1); - pfield->decReferenceCount(); - printf("after decReferenceCount referenceCounts pfield %d field0 %d field1 %d\n", - pfield->getReferenceCount(), - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - dumpString("high",&name0); - dumpString("low",&name1); - StructureArrayConstPtr pstructureArray = pfieldCreate->createStructureArray( - &valueName,pstructure); - pstructureArray->incReferenceCount(); - printf("after createStructureArray referenceCounts pstructureArray %d pfield %d field0 %d field1 %d\n", - pstructureArray->getReferenceCount(), - pfield->getReferenceCount(), - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - pstructureArray->decReferenceCount(); - printf("after structureArray decReferenceCount referenceCounts pfield %d field0 %d field1 %d\n", - pfield->getReferenceCount(), - fields[0]->getReferenceCount(), - fields[1]->getReferenceCount()); - dumpString("high",&name0); - dumpString("low",&name1); - printf("field recReferenceCount\n"); - pfield->decReferenceCount(); - dumpString("high",&name0); - dumpString("low",&name1); - return(0); -} diff --git a/pvDataApp/test/testIntrospect.cpp b/pvDataApp/test/testIntrospect.cpp index 9d90ac4..97e433c 100644 --- a/pvDataApp/test/testIntrospect.cpp +++ b/pvDataApp/test/testIntrospect.cpp @@ -18,45 +18,45 @@ int main(int argc,char *argv[]) bool value = ScalarTypeFunc::isNumeric(scalarType); printf("isNumeric %s\n",(value ? "true" : "false")); - std::string* myString= new std::string("type "); - TypeFunc::toString(myString,type); - *myString += " scalarType "; - ScalarTypeFunc::toString(myString,scalarType); - printf("%s\n",myString->c_str()); + String myString("type "); + TypeFunc::toString(&myString,type); + myString += " scalarType "; + ScalarTypeFunc::toString(&myString,scalarType); + printf("%s\n",myString.c_str()); FieldCreate * pfieldCreate = getFieldCreate(); - std::string valueName("value"); - ScalarConstPtr pscalar = pfieldCreate->createScalar(&valueName,scalarType); + StringConst valueName("value"); + ScalarConstPtr pscalar = pfieldCreate->createScalar(valueName,scalarType); type = pscalar->getType(); - myString->clear(); - *myString += "type "; - TypeFunc::toString(myString,type); - printf("%s\n",myString->c_str()); - myString->clear(); - *myString += "fieldName "; - StringConstPtr pfieldName = pscalar->getFieldName(); - *myString += *pfieldName; - printf("%s\n",myString->c_str()); - myString->clear(); - pscalar->toString(myString); - printf("%s\n",myString->c_str()); - ScalarArrayConstPtr pscalarArray = pfieldCreate->createScalarArray(&valueName,pvString); - myString->clear(); - pscalarArray->toString(myString); - printf("%s\n",myString->c_str()); + myString.clear(); + myString += "type "; + TypeFunc::toString(&myString,type); + printf("%s\n",myString.c_str()); + myString.clear(); + myString += "fieldName "; + StringConst fieldName = pscalar->getFieldName(); + myString += fieldName; + printf("%s\n",myString.c_str()); + myString.clear(); + pscalar->toString(&myString); + printf("%s\n",myString.c_str()); + ScalarArrayConstPtr pscalarArray = pfieldCreate->createScalarArray(valueName,pvString); + myString.clear(); + pscalarArray->toString(&myString); + printf("%s\n",myString.c_str()); int numberFields = 2; FieldConstPtr fields[numberFields]; - std::string name0("high"); - std::string name1("low"); - fields[0] = pfieldCreate->createScalar(&name0,pvDouble); - fields[1] = pfieldCreate->createScalar(&name1,pvDouble); + StringConst name0("high"); + StringConst name1("low"); + fields[0] = pfieldCreate->createScalar(name0,pvDouble); + fields[1] = pfieldCreate->createScalar(name1,pvDouble); StructureConstPtr pstructure = pfieldCreate->createStructure( - &valueName,numberFields,fields); - myString->clear(); - pstructure->toString(myString); - printf("%s\n",myString->c_str()); + valueName,numberFields,fields); + myString.clear(); + pstructure->toString(&myString); + printf("%s\n",myString.c_str()); FieldConstPtr pfield = pstructure; - myString->clear(); - pfield->toString(myString); - printf("as Field\n%s/n",myString->c_str()); + myString.clear(); + pfield->toString(&myString); + printf("as Field\n%s/n",myString.c_str()); return(0); } diff --git a/pvDataApp/test/testPVAuxInfo.cpp b/pvDataApp/test/testPVAuxInfo.cpp index c362d79..4c08ce2 100644 --- a/pvDataApp/test/testPVAuxInfo.cpp +++ b/pvDataApp/test/testPVAuxInfo.cpp @@ -13,13 +13,12 @@ using namespace epics::pvData; static FieldCreate * fieldCreate = 0; static PVDataCreate *pvDataCreate = 0; -static std::string theBuffer(""); -static std::string *buffer = &theBuffer; +static String buffer(""); void testDouble() { printf("\ntestDouble\n"); - std::string valueName("value"); - ScalarConstPtr pscalar = fieldCreate->createScalar(&valueName,pvDouble); + StringConst valueName("value"); + ScalarConstPtr pscalar = fieldCreate->createScalar(valueName,pvDouble); PVScalar *pvScalar = pvDataCreate->createPVScalar(0,pscalar); PVDouble *pvValue = dynamic_cast(pvScalar); double value = 2; @@ -29,15 +28,15 @@ void testDouble() { fprintf(stderr,"ERROR getValue put %f get %f\n",value,getValue); } PVAuxInfo *auxInfo = pvValue->getPVAuxInfo(); - std::string stringName("string"); - pvScalar = auxInfo->createInfo(&stringName,pvDouble); + StringConst stringName("string"); + pvScalar = auxInfo->createInfo(stringName,pvDouble); PVDouble *doubleInfo = dynamic_cast(pvScalar); doubleInfo->put(100.0); - pvScalar = auxInfo->getInfo(&stringName); - buffer->clear(); - *buffer += "stringInfo "; - pvScalar->toString(buffer); - printf("%s\n",buffer->c_str()); + pvScalar = auxInfo->getInfo(stringName); + buffer.clear(); + buffer += "stringInfo "; + pvScalar->toString(&buffer); + printf("%s\n",buffer.c_str()); delete pvValue; } diff --git a/pvDataApp/test/testPVScalar.cpp b/pvDataApp/test/testPVScalar.cpp index 25b32af..6869408 100644 --- a/pvDataApp/test/testPVScalar.cpp +++ b/pvDataApp/test/testPVScalar.cpp @@ -13,13 +13,12 @@ using namespace epics::pvData; static FieldCreate * pfieldCreate = 0; static PVDataCreate *pvDataCreate = 0; -static std::string theBuffer(""); -static std::string *buffer = &theBuffer; +static String buffer(""); void testDouble() { printf("\ntestDouble\n"); - std::string valueName("value"); - ScalarConstPtr pscalar = pfieldCreate->createScalar(&valueName,pvDouble); + StringConst valueName("value"); + ScalarConstPtr pscalar = pfieldCreate->createScalar(valueName,pvDouble); PVScalar *pvScalar = pvDataCreate->createPVScalar(0,pscalar); PVDouble *pvValue = (PVDouble *)pvScalar; double value = 2; @@ -30,9 +29,9 @@ void testDouble() { fprintf(stderr,"ERROR getValue put %f get %f\n",value,getValue); } FieldConstPtr field = pvValue->getField(); - buffer->clear(); - field->toString(buffer); - printf("%s\n",buffer->c_str()); + buffer.clear(); + field->toString(&buffer); + printf("%s\n",buffer.c_str()); epicsBoolean isImmutable = pvValue->isImmutable(); PVStructure *pvParent = pvValue->getParent(); printf("immutable %s parent %p\n", @@ -47,10 +46,10 @@ void testDouble() { if(scalar!=field) { fprintf(stderr,"ERROR field!=scalar field %p scalar %p\n",field,scalar); } - buffer->clear(); - *buffer += "value "; - pvValue->toString(buffer); - printf("%s\n",buffer->c_str()); + buffer.clear(); + buffer += "value "; + pvValue->toString(&buffer); + printf("%s\n",buffer.c_str()); delete pvValue; }