Fixed/bounded scalar array impl.

This commit is contained in:
Matej Sekoranja
2014-07-30 21:41:08 +02:00
parent a4954c3825
commit 622e140622
6 changed files with 316 additions and 198 deletions

View File

@@ -80,7 +80,7 @@ string Scalar::getID() const
return idScalarLUT[scalarType];
}
int8 Scalar::getTypeCodeLUT() const
int8 Scalar::getTypeCodeLUT(ScalarType scalarType)
{
static const int8 typeCodeLUT[] = {
0x00, // pvBoolean
@@ -102,7 +102,7 @@ int8 Scalar::getTypeCodeLUT() const
void Scalar::serialize(ByteBuffer *buffer, SerializableControl *control) const {
control->ensureBuffer(1);
buffer->putByte(getTypeCodeLUT());
buffer->putByte(getTypeCodeLUT(scalarType));
}
void Scalar::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*control*/) {
@@ -198,7 +198,8 @@ Array::Array(Type type)
Array::~Array() {}
ScalarArray::ScalarArray(ScalarType elementType)
: Array(scalarArray),elementType(elementType)
: Array(scalarArray),
elementType(elementType)
{
if(elementType<0 || elementType>MAX_SCALAR_TYPE)
throw std::invalid_argument("Can't construct ScalarArray from invalid ScalarType");
@@ -206,32 +207,12 @@ ScalarArray::ScalarArray(ScalarType elementType)
ScalarArray::~ScalarArray() {}
// TODO remove duplication, see Scalar::getTypeCodeLUT()
int8 ScalarArray::getTypeCodeLUT() const
{
static const int8 typeCodeLUT[] = {
0x00, // pvBoolean
0x20, // pvByte
0x21, // pvShort
0x22, // pvInt
0x23, // pvLong
0x24, // pvUByte
0x25, // pvUShort
0x26, // pvUInt
0x27, // pvULong
0x42, // pvFloat
0x43, // pvDouble
0x60 // pvString
};
return typeCodeLUT[elementType];
}
const string ScalarArray::getIDScalarArrayLUT() const
{
static const string idScalarArrayLUT[] = {
"boolean[]", // pvBoolean
"byte[]", // pvByte
"short[]", // pvShort
"boolean[]", // pvBoolean
"byte[]", // pvByte
"short[]", // pvShort
"int[]", // pvInt
"long[]", // pvLong
"ubyte[]", // pvUByte
@@ -257,13 +238,59 @@ std::ostream& ScalarArray::dump(std::ostream& o) const
void ScalarArray::serialize(ByteBuffer *buffer, SerializableControl *control) const {
control->ensureBuffer(1);
buffer->putByte((int8)0x08 | getTypeCodeLUT());
buffer->putByte((int8)0x08 | Scalar::getTypeCodeLUT(elementType));
}
void ScalarArray::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*control*/) {
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
BoundedScalarArray::~BoundedScalarArray() {}
BoundedScalarArray::BoundedScalarArray(ScalarType elementType, size_t size)
: ScalarArray(elementType),
size(size)
{
}
string BoundedScalarArray::getID() const
{
char buffer[32];
sprintf(buffer, "%s<%zu>", ScalarTypeFunc::name(getElementType()), size);
return string(buffer);
}
void BoundedScalarArray::serialize(ByteBuffer *buffer, SerializableControl *control) const {
control->ensureBuffer(1);
buffer->putByte((int8)0x10 | Scalar::getTypeCodeLUT(getElementType()));
SerializeHelper::writeSize(size, buffer, control);
}
FixedScalarArray::~FixedScalarArray() {}
FixedScalarArray::FixedScalarArray(ScalarType elementType, size_t size)
: ScalarArray(elementType),
size(size)
{
}
string FixedScalarArray::getID() const
{
char buffer[32];
sprintf(buffer, "%s[%zu]", ScalarTypeFunc::name(getElementType()), size);
return string(buffer);
}
void FixedScalarArray::serialize(ByteBuffer *buffer, SerializableControl *control) const {
control->ensureBuffer(1);
buffer->putByte((int8)0x18 | Scalar::getTypeCodeLUT(getElementType()));
SerializeHelper::writeSize(size, buffer, control);
}
StructureArray::StructureArray(StructureConstPtr const & structure)
: Array(structureArray),pstructure(structure)
{
@@ -668,6 +695,18 @@ FieldBuilderPtr FieldBuilder::addArray(string const & name, ScalarType scalarTyp
return shared_from_this();
}
FieldBuilderPtr FieldBuilder::addFixedArray(string const & name, ScalarType scalarType, size_t size)
{
fields.push_back(fieldCreate->createFixedScalarArray(scalarType, size)); fieldNames.push_back(name);
return shared_from_this();
}
FieldBuilderPtr FieldBuilder::addBoundedArray(string const & name, ScalarType scalarType, size_t size)
{
fields.push_back(fieldCreate->createBoundedScalarArray(scalarType, size)); fieldNames.push_back(name);
return shared_from_this();
}
FieldBuilderPtr FieldBuilder::addArray(string const & name, FieldConstPtr const & element)
{
switch (element->getType())
@@ -790,6 +829,22 @@ ScalarArrayConstPtr FieldCreate::createScalarArray(ScalarType elementType) const
return scalarArrays[elementType];
}
ScalarArrayConstPtr FieldCreate::createFixedScalarArray(ScalarType elementType, size_t size) const
{
if(elementType<0 || elementType>MAX_SCALAR_TYPE)
throw std::invalid_argument("Can't construct ScalarArray from invalid ScalarType");
return ScalarArrayConstPtr(new FixedScalarArray(elementType, size), Field::Deleter());
}
ScalarArrayConstPtr FieldCreate::createBoundedScalarArray(ScalarType elementType, size_t size) const
{
if(elementType<0 || elementType>MAX_SCALAR_TYPE)
throw std::invalid_argument("Can't construct ScalarArray from invalid ScalarType");
return ScalarArrayConstPtr(new BoundedScalarArray(elementType, size), Field::Deleter());
}
StructureConstPtr FieldCreate::createStructure () const
{
StringArray fieldNames;
@@ -991,15 +1046,14 @@ FieldConstPtr FieldCreate::deserialize(ByteBuffer* buffer, DeserializableControl
throw std::invalid_argument("invalid scalarArray type encoding");
if (isVariable)
return scalarArrays[scalarType];
/*
else if (isFixed)
return FieldConstPtr(new ScalarFixedArray(scalarType, size), Field::Deleter());
return FieldConstPtr(
new FixedScalarArray(static_cast<epics::pvData::ScalarType>(scalarType), size),
Field::Deleter());
else
return FieldConstPtr(new ScalarBoundedArray(scalarType, size), Field::Deleter());
*/
// TODO
else
throw std::invalid_argument("only variant array supported for now");
return FieldConstPtr(
new BoundedScalarArray(static_cast<epics::pvData::ScalarType>(scalarType), size),
Field::Deleter());
}
else if (typeCode == 0x80)
{