Add FieldBuilder::begin() and Field::build()

Boilerplate reduction in structure
definition and instanciation.
This commit is contained in:
Michael Davidsaver
2018-10-01 14:48:33 -07:00
parent aa87a2a23d
commit 45265b4f9b
2 changed files with 83 additions and 1 deletions

View File

@@ -25,6 +25,7 @@
#include <pv/factory.h>
#include <pv/serializeHelper.h>
#include <pv/thread.h>
#include <pv/pvData.h>
using std::tr1::static_pointer_cast;
using std::size_t;
@@ -102,6 +103,11 @@ Field::~Field() {
}
}
std::tr1::shared_ptr<PVField> Field::build() const
{
FieldConstPtr self(shared_from_this());
return getPVDataCreate()->createPVField(self);
}
std::ostream& operator<<(std::ostream& o, const Field& f)
{
@@ -172,6 +178,11 @@ void Scalar::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*contro
}
std::tr1::shared_ptr<PVScalar> Scalar::build() const
{
return getPVDataCreate()->createPVScalar(std::tr1::static_pointer_cast<const Scalar>(shared_from_this()));
}
std::string BoundedString::getID() const
@@ -338,6 +349,11 @@ void ScalarArray::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*c
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
std::tr1::shared_ptr<PVScalarArray> ScalarArray::build() const
{
return getPVDataCreate()->createPVScalarArray(std::tr1::static_pointer_cast<const ScalarArray>(shared_from_this()));
}
BoundedScalarArray::~BoundedScalarArray() {}
@@ -418,6 +434,11 @@ void StructureArray::deserialize(ByteBuffer* /*buffer*/, DeserializableControl*
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVStructure> > > StructureArray::build() const
{
return getPVDataCreate()->createPVStructureArray(std::tr1::static_pointer_cast<const StructureArray>(shared_from_this()));
}
UnionArray::UnionArray(UnionConstPtr const & _punion)
: Array(unionArray),punion(_punion)
{
@@ -460,6 +481,11 @@ void UnionArray::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*co
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVUnion> > > UnionArray::build() const
{
return getPVDataCreate()->createPVUnionArray(std::tr1::static_pointer_cast<const UnionArray>(shared_from_this()));
}
const string Structure::DEFAULT_ID = Structure::defaultId();
const string & Structure::defaultId()
@@ -597,6 +623,11 @@ void Structure::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*con
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
std::tr1::shared_ptr<PVStructure> Structure::build() const
{
return getPVDataCreate()->createPVStructure(std::tr1::static_pointer_cast<const Structure>(shared_from_this()));
}
const string Union::DEFAULT_ID = Union::defaultId();
const string & Union::defaultId()
@@ -795,6 +826,11 @@ void Union::deserialize(ByteBuffer* /*buffer*/, DeserializableControl* /*control
throw std::runtime_error("not valid operation, use FieldCreate::deserialize instead");
}
std::tr1::shared_ptr<PVUnion> Union::build() const
{
return getPVDataCreate()->createPVUnion(std::tr1::static_pointer_cast<const Union>(shared_from_this()));
}
FieldBuilder::FieldBuilder()
:fieldCreate(getFieldCreate())
,idSet(false)
@@ -896,6 +932,19 @@ void FieldBuilder::reset()
fields.clear();
}
FieldBuilderPtr FieldBuilder::begin()
{
FieldBuilderPtr ret(new FieldBuilder);
return ret;
}
FieldBuilderPtr FieldBuilder::begin(StructureConstPtr S)
{
FieldBuilderPtr ret(new FieldBuilder(S.get()));
return ret;
}
FieldBuilderPtr FieldBuilder::setId(string const & id)
{
this->id = id;

View File

@@ -118,6 +118,13 @@ class UnionArray;
class BoundedString;
class PVField;
class PVScalar;
class PVScalarArray;
class PVStructure;
class PVUnion;
template<typename T> class PVValueArray;
/**
* typedef for a shared pointer to an immutable Field.
*/
@@ -341,6 +348,9 @@ public:
*/
virtual std::ostream& dump(std::ostream& o) const = 0;
//! Allocate a new instance
std::tr1::shared_ptr<PVField> build() const;
protected:
/**
* Constructor
@@ -387,6 +397,9 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVScalar> build() const;
protected:
Scalar(ScalarType scalarType);
@@ -492,6 +505,9 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVScalarArray> build() const;
virtual ~ScalarArray();
private:
@@ -594,6 +610,9 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVStructure> > > build() const;
protected:
/**
* Constructor.
@@ -635,6 +654,9 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVUnion> > > build() const;
protected:
/**
* Constructor.
@@ -742,7 +764,10 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVStructure> build() const;
protected:
Structure(StringArray const & fieldNames, FieldConstPtrArray const & fields, std::string const & id = defaultId());
private:
@@ -877,6 +902,9 @@ public:
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
//! Allocate a new instance
std::tr1::shared_ptr<PVUnion> build() const;
protected:
Union();
@@ -910,6 +938,11 @@ class epicsShareClass FieldBuilder :
public std::tr1::enable_shared_from_this<FieldBuilder>
{
public:
//! Create a new instance of in-line @c Field builder.
static FieldBuilderPtr begin();
//! Create a new instance of in-line @c Field builder pre-initialized with and existing Structure
static FieldBuilderPtr begin(StructureConstPtr S);
/**
* Set ID of an object to be created.
* @param id id to be set.