17#include <epicsAssert.h>
20#include <pv/noDefaultMethods.h>
22#include <pv/byteBuffer.h>
23#include <pv/serialize.h>
24#include <pv/pvdVersion.h>
27#define PVD_DEPRECATED_52 PVD_DEPRECATED("See https://github.com/epics-base/pvDataCPP/issues/52")
40# if __cplusplus>=201103L
47# if __cplusplus>=201103L
48# define OVERRIDE override
62 indent_level(
long l) : level(l) {}
77 long& l = indent_value(
ios);
84 indent_value(stream) = saved_level;
98 array_at(std::size_t ix) : index(ix) {}
101struct array_at_internal
106 array_at_internal(std::size_t ix,
std::ostream& str) : index(ix), stream(str) {}
272#define MAX_SCALAR_TYPE pvString
330 public std::tr1::enable_shared_from_this<Field> {
332 static size_t num_instances;
334 POINTER_DEFINITIONS(
Field);
356 std::tr1::shared_ptr<PVField>
build()
const;
368 const Type m_fieldType;
371 friend struct Helper;
373 friend class StructureArray;
374 friend class Structure;
375 friend class PVFieldPvt;
376 friend class StandardField;
377 friend class BasePVStructureArray;
378 friend class FieldCreate;
379 EPICS_NOT_COPYABLE(
Field)
389class epicsShareClass Scalar :
public Field{
391 POINTER_DEFINITIONS(Scalar);
393 typedef Scalar& reference;
394 typedef const Scalar& const_reference;
417 friend class FieldCreate;
418 friend class ScalarArray;
419 friend class BoundedScalarArray;
420 friend class FixedScalarArray;
421 friend class BoundedString;
422 EPICS_NOT_COPYABLE(Scalar)
429class epicsShareClass BoundedString : public Scalar{
431 POINTER_DEFINITIONS(BoundedString);
432 virtual ~BoundedString();
433 typedef BoundedString& reference;
434 typedef const BoundedString& const_reference;
440 std::
size_t getMaximumLength() const;
443 BoundedString(
std::
size_t maxStringLength);
445 std::
size_t maxLength;
446 friend class FieldCreate;
447 EPICS_NOT_COPYABLE(BoundedString)
456 POINTER_DEFINITIONS(
Array);
458 typedef Array& reference;
459 typedef const Array& const_reference;
461 enum ArraySizeType { variable, fixed, bounded };
482 EPICS_NOT_COPYABLE(
Array)
523 const
std::
string getIDScalarArrayLUT() const;
525 friend class FieldCreate;
559 friend class FieldCreate;
591 friend class FieldCreate;
636 friend class FieldCreate;
681 friend class FieldCreate;
689class epicsShareClass Structure : public
Field {
691 POINTER_DEFINITIONS(Structure);
704 virtual ~Structure();
705 typedef Structure& reference;
706 typedef const Structure& const_reference;
725 template<
typename FT>
728 STATIC_ASSERT(FT::isField);
729 return std::tr1::dynamic_pointer_cast<const FT>(
getField(fieldName));
745 template<
typename FT>
748 STATIC_ASSERT(FT::isField);
749 std::tr1::shared_ptr<const FT> result(
750 std::tr1::dynamic_pointer_cast<const FT>(
getFieldT(fieldName))
771 template<
typename FT>
772 std::tr1::shared_ptr<const FT>
getField(std::size_t index)
const
774 STATIC_ASSERT(FT::isField);
775 return std::tr1::dynamic_pointer_cast<const FT>(
getField(index));
791 template<
typename FT>
792 std::tr1::shared_ptr<const FT>
getFieldT(std::size_t index)
const
794 STATIC_ASSERT(FT::isField);
795 std::tr1::shared_ptr<const FT> result(
796 std::tr1::dynamic_pointer_cast<const FT>(
getFieldT(index))
846 FieldConstPtr getFieldImpl(const
std::
string& fieldName,
bool throws) const;
849 friend class FieldCreate;
851 EPICS_NOT_COPYABLE(Structure)
858class epicsShareClass Union : public
Field {
860 POINTER_DEFINITIONS(Union);
885 typedef Union& reference;
886 typedef const Union& const_reference;
905 template<
typename FT>
908 STATIC_ASSERT(FT::isField);
909 return std::tr1::dynamic_pointer_cast<const FT>(
getField(fieldName));
925 template<
typename FT>
928 STATIC_ASSERT(FT::isField);
929 std::tr1::shared_ptr<const FT> result(
930 std::tr1::dynamic_pointer_cast<const FT>(
getFieldT(fieldName))
951 template<
typename FT>
952 std::tr1::shared_ptr<const FT>
getField(std::size_t index)
const
954 STATIC_ASSERT(FT::isField);
955 return std::tr1::dynamic_pointer_cast<const FT>(
getField(index));
971 template<
typename FT>
972 std::tr1::shared_ptr<const FT>
getFieldT(std::size_t index)
const
974 STATIC_ASSERT(FT::isField);
975 std::tr1::shared_ptr<const FT> result(
976 std::tr1::dynamic_pointer_cast<const FT>(
getFieldT(index))
1043 FieldConstPtr getFieldImpl(const
std::
string& fieldName,
bool throws) const;
1046 friend class FieldCreate;
1047 friend class Structure;
1048 EPICS_NOT_COPYABLE(Union)
1052typedef
std::tr1::shared_ptr<FieldCreate> FieldCreatePtr;
1064class epicsShareClass FieldBuilder :
1065 public
std::tr1::enable_shared_from_this<FieldBuilder>
1204 FieldBuilder(
const FieldBuilderPtr & _parentBuilder,
const std::string& name,
const Structure*);
1206 FieldBuilder(
const FieldBuilderPtr & _parentBuilder,
const std::string& name,
const Union*);
1208 FieldBuilder(FieldBuilderPtr
const & parentBuilder,
1210 Type nestedClassToBuild,
bool nestedArray);
1217 friend class FieldCreate;
1219 const FieldCreatePtr fieldCreate;
1227 const FieldBuilderPtr parentBuilder;
1228 const Type nestedClassToBuild;
1230 const bool nestedArray;
1231 const bool createNested;
1235struct field_factory;
1242class epicsShareClass FieldCreate {
1243 friend struct detail::field_factory;
1245 static const FieldCreatePtr &getFieldCreate();
1395 mutable Mutex mutex;
1397 mutable cache_t cache;
1401 EPICS_NOT_COPYABLE(FieldCreate)
1409 return FieldCreate::getFieldCreate();
1431template<ScalarType ID>
1434#define OP(ENUM, TYPE) \
1435template<> struct ScalarTypeTraits<ENUM> {typedef TYPE type;}; \
1436template<> struct ScalarTypeID<TYPE> { enum {value=ENUM}; }; \
1437template<> struct ScalarTypeID<const TYPE> { enum {value=ENUM}; };
1453bool epicsShareExtern compare(
const Field&,
const Field&);
1454bool epicsShareExtern compare(
const Scalar&,
const Scalar&);
1458bool epicsShareExtern compare(
const Union&,
const Union&);
1468#define MAKE_COMPARE(CLASS) \
1469static FORCE_INLINE bool operator==(const CLASS& a, const CLASS& b) {return (void*)&a==(void*)&b;} \
1470static FORCE_INLINE bool operator!=(const CLASS& a, const CLASS& b) {return !(a==b);}
basic_ostream< char > ostream
basic_string< char > string
basic_ostream< _CharT, _Traits > & operator<<(basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Alloc > &__str)
constexpr auto size(const _Container &__cont) noexcept(noexcept(__cont.size())) -> decltype(__cont.size())
reference at(size_type __n)
This class implements introspection object for Array.
virtual ArraySizeType getArraySizeType() const =0
virtual std::size_t getMaximumCapacity() const =0
virtual std::size_t getMaximumCapacity() const
virtual ArraySizeType getArraySizeType() const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::string getID() const
BoundedScalarArray(ScalarType scalarType, std::size_t size)
This class implements introspection object for BoundedString.
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::string getID() const
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Callback class for deserialization.
Interface for in-line creating of introspection interfaces.
FieldBuilderPtr addNestedUnionArray(std::string const &name)
static FieldBuilderPtr begin()
FieldBuilderPtr setId(std::string const &id)
FieldBuilderPtr addBoundedArray(std::string const &name, ScalarType scalarType, std::size_t bound)
FieldBuilderPtr addNestedStructureArray(std::string const &name)
FieldBuilderPtr addNestedUnion(std::string const &name)
FieldBuilderPtr addFixedArray(std::string const &name, ScalarType scalarType, std::size_t size)
FieldBuilderPtr addNestedStructure(std::string const &name)
FieldBuilderPtr addArray(std::string const &name, ScalarType scalarType)
StructureConstPtr createStructure()
FieldBuilderPtr add(std::string const &name, ScalarType scalarType)
FieldBuilderPtr add(std::string const &name, FieldConstPtr const &field)
FieldBuilderPtr addBoundedString(std::string const &name, std::size_t maxLength)
UnionConstPtr createUnion()
FieldBuilderPtr addArray(std::string const &name, FieldConstPtr const &element)
FieldBuilderPtr endNested()
static FieldBuilderPtr begin(StructureConstPtr S)
Create a new instance of in-line Field builder pre-initialized with and existing Structure.
StructureConstPtr createStructure(std::string const &id, StringArray const &fieldNames, FieldConstPtrArray const &fields) const
ScalarConstPtr createScalar(ScalarType scalarType) const
StructureConstPtr createStructure() const
StructureConstPtr appendFields(StructureConstPtr const &structure, StringArray const &fieldNames, FieldConstPtrArray const &fields) const
UnionArrayConstPtr createVariantUnionArray() const
UnionConstPtr createUnion(StringArray const &fieldNames, FieldConstPtrArray const &fields) const
StructureArrayConstPtr createStructureArray(StructureConstPtr const &structure) const
StructureConstPtr createStructure(StringArray const &fieldNames, FieldConstPtrArray const &fields) const
FieldBuilderPtr createFieldBuilder() const
StructureConstPtr appendField(StructureConstPtr const &structure, std::string const &fieldName, FieldConstPtr const &field) const
FieldBuilderPtr createFieldBuilder(StructureConstPtr S) const
FieldConstPtr deserialize(ByteBuffer *buffer, DeserializableControl *control) const
UnionConstPtr createVariantUnion() const
UnionArrayConstPtr createUnionArray(UnionConstPtr const &punion) const
BoundedStringConstPtr createBoundedString(std::size_t maxLength) const
ScalarArrayConstPtr createScalarArray(ScalarType elementType) const
UnionConstPtr createUnion(std::string const &id, StringArray const &fieldNames, FieldConstPtrArray const &fields) const
ScalarArrayConstPtr createBoundedScalarArray(ScalarType elementType, std::size_t bound) const
This class implements introspection object for field.
virtual std::string getID() const =0
virtual std::ostream & dump(std::ostream &o) const =0
std::tr1::shared_ptr< PVField > build() const
virtual std::size_t getMaximumCapacity() const
virtual ArraySizeType getArraySizeType() const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::string getID() const
FixedScalarArray(ScalarType scalarType, std::size_t size)
PVField is the base class for each PVData field.
Base class for a scalarArray.
PVScalar is the base class for each scalar field.
Data interface for a structure,.
PVUnion has a single subfield.
template class for all extensions of PVArray.
This class implements introspection object for scalar array.
virtual ArraySizeType getArraySizeType() const
virtual std::size_t getMaximumCapacity() const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::ostream & dump(std::ostream &o) const
ScalarArray(ScalarType scalarType)
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
virtual std::string getID() const
std::tr1::shared_ptr< PVScalarArray > build() const
ScalarType getElementType() const
This class implements introspection object for Scalar.
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
std::tr1::shared_ptr< PVScalar > build() const
virtual std::ostream & dump(std::ostream &o) const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::string getID() const
ScalarType getScalarType() const
Callback class for serialization.
Base class for serialization.
This class implements introspection object for a structureArray.
StructureArray(StructureConstPtr const &structure)
virtual std::size_t getMaximumCapacity() const
virtual std::ostream & dump(std::ostream &o) const
virtual ArraySizeType getArraySizeType() const
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
virtual std::string getID() const
std::tr1::shared_ptr< PVValueArray< std::tr1::shared_ptr< PVStructure > > > build() const
const StructureConstPtr & getStructure() const
This class implements introspection object for a structure.
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
StringArray const & getFieldNames() const
static const std::string DEFAULT_ID
static const std::string & defaultId()
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
const FieldConstPtr & getField(std::size_t index) const
std::size_t getFieldIndex(std::string const &fieldName) const
std::size_t getNumberFields() const
virtual std::ostream & dump(std::ostream &o) const
FieldConstPtrArray const & getFields() const
std::tr1::shared_ptr< PVStructure > build() const
FieldConstPtr getFieldT(std::string const &fieldName) const
FieldConstPtr getFieldT(std::size_t index) const
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
virtual std::string getID() const
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
FieldConstPtr getField(std::string const &fieldName) const
const std::string & getFieldName(std::size_t fieldIndex) const
This class implements introspection object for a unionArray.
std::tr1::shared_ptr< PVValueArray< std::tr1::shared_ptr< PVUnion > > > build() const
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
virtual ArraySizeType getArraySizeType() const
virtual std::size_t getMaximumCapacity() const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
UnionArray(UnionConstPtr const &_punion)
virtual std::ostream & dump(std::ostream &o) const
UnionConstPtr getUnion() const
virtual std::string getID() const
This class implements introspection object for a union.
FieldConstPtr getField(std::string const &fieldName) const
std::tr1::shared_ptr< PVUnion > build() const
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
static const std::string ANY_ID
FieldConstPtr getField(std::size_t index) const
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
virtual std::ostream & dump(std::ostream &o) const
virtual std::string getID() const
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
static const std::string & defaultId()
static const std::string DEFAULT_ID
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control)
FieldConstPtr getFieldT(std::string const &fieldName) const
std::size_t getFieldIndex(std::string const &fieldName) const
std::size_t getNumberFields() const
virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const
FieldConstPtrArray const & getFields() const
StringArray const & getFieldNames() const
static const std::string & anyId()
int32 guess(Type t, ScalarType s) const
std::string getFieldName(std::size_t fieldIndex) const
FieldConstPtr getFieldT(std::size_t index) const
Convenience functions for ScalarType.
bool isInteger(ScalarType scalarType)
bool isPrimitive(ScalarType scalarType)
size_t elementSize(ScalarType id)
gives sizeof(T) where T depends on the scalar type id.
bool isNumeric(ScalarType scalarType)
bool isUInteger(ScalarType scalarType)
ScalarType getScalarType(std::string const &value)
const char * name(ScalarType scalarType)
Convenience functions for Type.
const char * name(Type type)
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
std::tr1::shared_ptr< const Structure > StructureConstPtr
const FieldCreatePtr & getFieldCreate()
std::tr1::shared_ptr< const BoundedString > BoundedStringConstPtr
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
std::vector< std::string > StringArray
std::vector< FieldConstPtr > FieldConstPtrArray
std::tr1::shared_ptr< const ScalarArray > ScalarArrayConstPtr
std::tr1::shared_ptr< const Array > ArrayConstPtr
std::tr1::shared_ptr< const UnionArray > UnionArrayConstPtr
std::tr1::shared_ptr< const Field > FieldConstPtr
std::tr1::shared_ptr< const Union > UnionConstPtr