From 1dba7a675d956333a16b86284cf9076648366bdd Mon Sep 17 00:00:00 2001 From: Matej Sekoranja Date: Tue, 26 Nov 2013 10:46:58 +0100 Subject: [PATCH] testServer: ported to shared vector --- testApp/remote/testNTImage.cpp | 55 +++++++++------- testApp/remote/testServer.cpp | 112 ++++++++++++++++----------------- 2 files changed, 87 insertions(+), 80 deletions(-) diff --git a/testApp/remote/testNTImage.cpp b/testApp/remote/testNTImage.cpp index 008a7e1..bd4a5d4 100644 --- a/testApp/remote/testNTImage.cpp +++ b/testApp/remote/testNTImage.cpp @@ -86,17 +86,23 @@ void setImageArrayValues( String id = imagePV->getStructure()->getID(); PVByteArrayPtr pvField = static_pointer_cast(imagePV->getSubField("value")); - size_t dataSize = raw_size; - pvField->setCapacity(dataSize); const int8_t *data = raw; + size_t dataSize = raw_size; + + PVByteArray::svector temp(pvField->reuse()); + temp.resize(dataSize); if (data) - pvField->put(0, dataSize, data, 0); + std::copy(data, data + dataSize, temp.begin()); + pvField->replace(freeze(temp)); PVIntArrayPtr dimField = static_pointer_cast( imagePV->getScalarArrayField(String("dim"), pvInt)); - dimField->setCapacity(raw_dim_size); + const int32_t *dim = raw_dim; - dimField->put(0, raw_dim_size, dim, 0); + PVIntArray::svector temp2(dimField->reuse()); + temp2.resize(raw_dim_size); + std::copy(dim, dim + raw_dim_size, temp2.begin()); + dimField->replace(freeze(temp2)); } @@ -112,28 +118,36 @@ void setImageImageValues( PVIntArrayPtr offsetField = static_pointer_cast( imagePV->getScalarArrayField(String("offset"), pvInt)); - offsetField->setCapacity(2); + PVIntArray::svector temp(offsetField->reuse()); + temp.resize(2); int32_t offsets[] = { 0, 0 }; - offsetField->put(0, 2, offsets, 0); + std::copy(offsets, offsets + 2, temp.begin()); + offsetField->replace(freeze(temp)); PVIntArrayPtr binningField = static_pointer_cast( imagePV->getScalarArrayField(String("binning"), pvInt)); - binningField->setCapacity(2); + temp = binningField->reuse(); + temp.resize(2); int32_t binnings[] = { 1, 1 }; - binningField->put(0, 2, binnings, 0); + std::copy(binnings, binnings + 2, temp.begin()); + binningField->replace(freeze(temp)); PVIntArrayPtr reverseField = static_pointer_cast( imagePV->getScalarArrayField(String("reverse"), pvInt)); reverseField->setCapacity(2); + temp = reverseField->reuse(); + temp.resize(2); int32_t reverses[] = { 0, 0 }; - reverseField->put(0, 2, reverses, 0); + std::copy(reverses, reverses + 2, temp.begin()); + reverseField->replace(freeze(temp)); PVIntArrayPtr fullDimField = static_pointer_cast( imagePV->getScalarArrayField(String("fullDim"), pvInt)); - fullDimField->setCapacity(raw_dim_size); + temp = fullDimField->reuse(); + temp.resize(raw_dim_size); const int32_t *fullDim = raw_dim; - fullDimField->put(0, raw_dim_size, fullDim, 0); - + std::copy(fullDim, fullDim + raw_dim_size, temp.begin()); + fullDimField->replace(freeze(temp)); } @@ -174,14 +188,11 @@ void rotateImage(PVStructure::shared_pointer const & imagePV, const int8_t* orig { PVScalarArrayPtr value = static_pointer_cast(imagePV->getSubField("value")); PVIntArrayPtr dim = static_pointer_cast(imagePV->getScalarArrayField("dim", pvInt)); - // dim[] = { rows, columns } - int32 rows, cols; - size_t dims = dim->getLength(); - IntArrayData data; - dim->get(0, dims, data); - cols = data.data[0]; - rows = data.data[1]; + PVIntArray::const_svector data = dim->view(); + // dim[] = { rows, columns } + int32 cols = data[0]; + int32 rows = data[1]; PVByteArrayPtr array = static_pointer_cast(value); @@ -195,7 +206,8 @@ void rotateImage(PVStructure::shared_pointer const & imagePV, const int8_t* orig int32 colsm2 = cols-2; int32 rowsm2 = rows-2; - int8_t* img = array->get(); + PVByteArray::svector imgData(array->reuse()); + int8_t* img = imgData.data(); for (int32 y = 0; y < rows; y++) { @@ -232,6 +244,7 @@ void rotateImage(PVStructure::shared_pointer const & imagePV, const int8_t* orig } } } + array->replace(freeze(imgData)); PVIntPtr uniqueIdField = imagePV->getIntField(String("uniqueId")); uniqueIdField->put(uniqueIdField->get()+1); diff --git a/testApp/remote/testServer.cpp b/testApp/remote/testServer.cpp index 0543284..bda0f7f 100644 --- a/testApp/remote/testServer.cpp +++ b/testApp/remote/testServer.cpp @@ -170,14 +170,20 @@ public: epicsUInt32 len = adcSim->prev_nSamples; double *val = adcSim->data.value.get(); - static_pointer_cast(adcMatrix->getScalarArrayField("value", pvDouble))->put(0, len, val, 0); + PVDoubleArrayPtr adcSimArray = adcMatrix->getSubField("value"); + PVDoubleArray::svector temp(adcSimArray->reuse()); + temp.resize(len); + std::copy(val, val + len, temp.begin()); + adcSimArray->replace(freeze(temp)); baseValue::shape_t* shape = &adcSim->data.shape; size_t shapeLen = shape->size(); - vector intVal(shapeLen); - for (size_t i = 0; i < shapeLen; i++) - intVal[i] = (*shape)[i]; - static_pointer_cast(adcMatrix->getScalarArrayField("dim", pvInt))->put(0, shapeLen, &intVal[0], 0); + + PVIntArrayPtr adcSimShape = adcMatrix->getSubField("dim"); + PVIntArray::svector temp2(adcSimShape->reuse()); + temp2.resize(shapeLen); + std::copy(shape->begin(), shape->end(), temp2.begin()); + adcSimShape->replace(freeze(temp2)); PVStructure::shared_pointer ts = adcMatrix->getStructureField("timeStamp"); @@ -248,13 +254,13 @@ static epics::pvData::PVStructure::shared_pointer createNTTable(int columnsCount StringArray fieldNames(columnsCount); FieldConstPtrArray fields(columnsCount); char sbuf[16]; - vector labels; + PVStringArray::svector labels(columnsCount); for (int i = 0; i < columnsCount; i++) { sprintf(sbuf, "column%d", i); fieldNames[i] = sbuf; fields[i] = getFieldCreate()->createScalarArray(pvDouble); - labels.push_back(sbuf); + labels[i] = sbuf; } Structure::const_shared_pointer valueStructure( @@ -274,17 +280,15 @@ static epics::pvData::PVStructure::shared_pointer createNTTable(int columnsCount "uri:ev4:nt/2012/pwd:NTTable", tableFieldNames, tableFields) ) ); - static_pointer_cast(result->getScalarArrayField("labels", pvString))->put(0, labels.size(), &labels[0], 0); + result->getSubField("labels")->replace(freeze(labels)); return result; } static void generateNTTableDoubleValues(epics::pvData::PVStructure::shared_pointer result) { - PVStringArray::shared_pointer pvLabels(static_pointer_cast(result->getScalarArrayField("labels", pvString))); - StringArrayData ld; - pvLabels->get(0, pvLabels->getLength(), ld); - + PVStringArray::shared_pointer pvLabels = (static_pointer_cast(result->getScalarArrayField("labels", pvString))); + PVStringArray::const_svector ld(pvLabels->view()); PVStructure::shared_pointer resultValue = result->getStructureField("value"); @@ -295,12 +299,16 @@ static void generateNTTableDoubleValues(epics::pvData::PVStructure::shared_point values[r] = rand()/((double)RAND_MAX+1) + OFFSET; int offset = 0; - for (vector::iterator iter = ld.data.begin(); - iter != ld.data.end(); + for (PVStringArray::const_svector::const_iterator iter = ld.begin(); + iter != ld.end(); iter++, offset++) { FILL_VALUES(offset); - static_pointer_cast(resultValue->getScalarArrayField(*iter, pvDouble))->put(0, ROWS, values, 0); + PVDoubleArray::shared_pointer arr = resultValue->getSubField(*iter); + PVDoubleArray::svector temp(arr->reuse()); + temp.resize(ROWS); + std::copy(values, values + ROWS, temp.begin()); + arr->replace(freeze(temp)); } } @@ -1058,11 +1066,11 @@ public: int columnsCount = atoi(columns->get().c_str()); char sbuf[16]; - vector labels; + PVStringArray::svector labels(columnsCount); for (int i = 0; i < columnsCount; i++) { sprintf(sbuf, "name%d", i); - labels.push_back(sbuf); + labels[i] = sbuf; } StringArray tableFieldNames(2); @@ -1078,13 +1086,13 @@ public: "uri:ev4:nt/2012/pwd:NTNameValue", tableFieldNames, tableFields) ) ); - static_pointer_cast(result->getScalarArrayField("name", pvString))->put(0, labels.size(), &labels[0], 0); + result->getSubField("name")->replace(freeze(labels)); int32 len = columnsCount; - vector mv(len); + PVDoubleArray::svector mv(len); for (int r = 0; r < len; r++) mv[r] = rand()/((double)RAND_MAX+1) + (int)(r); - static_pointer_cast(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0); + result->getSubField("value")->replace(freeze(mv)); m_channelRPCRequester->requestDone(Status::Ok, result); } @@ -1134,20 +1142,22 @@ public: int32 rowsVal = atoi(rows->get().c_str()); int32 colsVal = atoi(columns->get().c_str()); - int32 dimValues[] = { rowsVal, colsVal }; - static_pointer_cast(result->getScalarArrayField("dim", pvInt))->put(0, 2, &dimValues[0], 0); + PVIntArray::svector dimValues(2); + dimValues[0] = rowsVal; + dimValues[1] = colsVal; + result->getSubField("dim")->replace(freeze(dimValues)); PVStringPtr byColumns = static_pointer_cast(args->getSubField("bycolumns")); bool bycolumns = (byColumns.get() && byColumns->get() == "1"); int32 len = rowsVal * colsVal; - vector mv(len); + PVDoubleArray::svector mv(len); for (int r = 0; r < len; r++) if (bycolumns) mv[r] = rand()/((double)RAND_MAX+1) + (int)(r%rowsVal); else mv[r] = rand()/((double)RAND_MAX+1) + (int)(r/colsVal); - static_pointer_cast(result->getScalarArrayField("value", pvDouble))->put(0, len, &mv[0], 0); + result->getSubField("value")->replace(freeze(mv)); m_channelRPCRequester->requestDone(Status::Ok, result); } @@ -1220,10 +1230,10 @@ public: } PVByteArrayPtr value = std::tr1::dynamic_pointer_cast(m_pvStructure->getSubField("value")); - value->setCapacity(fileSize); - - value->setLength(fileSize); - in.readsome((char*)value->get(), fileSize); + PVByteArray::svector temp(value->reuse()); + temp.resize(fileSize); + in.readsome((char*)temp.data(), fileSize); + value->replace(freeze(temp)); m_channelRPCRequester->requestDone(Status::Ok, m_pvStructure); @@ -1561,45 +1571,28 @@ protected: if (done && specCount > 0) { - pvField->setCapacity(specCount); - pvField->setLength(specCount); + PVDoubleArray::svector temp(pvField->reuse()); + temp.resize(specCount); double v = 0; - int ix = 0; - const int COUNT = 1024; - - int n = 0; - while (n < specCount) + for (int n = 0; n < specCount; n++) { - - double array[COUNT]; - int i = 0; - for (; i < COUNT && n < specCount; i++) - { - array[i] = v; v+=1; n++; - } - pvField->put(ix, i, array, 0); - ix += i; + temp[n] = v; v+=1; } + pvField->replace(freeze(temp)); } else { + PVDoubleArray::svector temp(pvField->reuse()); + specCount = 1024*1024; + temp.resize(specCount); + double v = 0; - int ix = 0; - const int COUNT = 1024; - - pvField->setCapacity(1024*COUNT); - for (int n = 0; n < 1024; n++) + for (int n = 0; n < specCount; n++) { - - double array[COUNT]; - for (int i = 0; i < COUNT; i++) - { - array[i] = v; v+=1.1; - } - pvField->put(ix, COUNT, array, 0); - ix += COUNT; + temp[n] = v; v+=1.1; } + pvField->replace(freeze(temp)); } /* printf("array prepared------------------------------------!!!\n"); @@ -1645,8 +1638,9 @@ protected: ); // fill with default values - int dimValue = 0; - static_pointer_cast(m_pvStructure->getScalarArrayField("dim", pvInt))->put(0, 1, &dimValue, 0); + PVIntArray::svector dimValue(1); + dimValue[0] = 0; + m_pvStructure->getSubField("dim")->replace(freeze(dimValue)); m_pvStructure->getStringField("descriptor")->put("Simulated ADC that provides NTMatrix value"); PVStructurePtr displayStructure = m_pvStructure->getStructureField("display");