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
54namespace epics {
namespace pvData {
77 long& l = indent_value(
ios);
84 indent_value(
stream) = saved_level;
98 array_at(std::size_t ix) : index(ix) {}
104 std::ostream& stream;
215epicsShareExtern std::ostream&
operator<<(std::ostream& o,
const Type& type);
272#define MAX_SCALAR_TYPE pvString
278namespace ScalarTypeFunc {
330 public std::tr1::enable_shared_from_this<Field> {
332 static size_t num_instances;
334 POINTER_DEFINITIONS(
Field);
345 virtual std::string
getID()
const = 0;
352 virtual std::ostream&
dump(std::ostream& o)
const = 0;
356 std::tr1::shared_ptr<PVField>
build()
const;
368 const Type m_fieldType;
371 friend struct Helper;
375 friend class PVFieldPvt;
377 friend class BasePVStructureArray;
379 EPICS_NOT_COPYABLE(
Field)
382epicsShareExtern std::ostream&
operator<<(std::ostream& o,
const Field& field);
391 POINTER_DEFINITIONS(
Scalar);
401 virtual std::string
getID() const OVERRIDE;
422 EPICS_NOT_COPYABLE(
Scalar)
436 virtual std::string
getID() const OVERRIDE FINAL;
440 std::
size_t getMaximumLength() const;
445 std::
size_t maxLength;
456 POINTER_DEFINITIONS(
Array);
461 enum ArraySizeType { variable,
fixed, bounded };
482 EPICS_NOT_COPYABLE(
Array)
510 virtual std::string
getID() const OVERRIDE;
523 const
std::
string getIDScalarArrayLUT() const;
552 virtual std::string
getID() const OVERRIDE FINAL;
584 virtual std::string
getID() const OVERRIDE FINAL;
615 virtual std::string
getID() const OVERRIDE FINAL;
660 virtual std::string
getID() const OVERRIDE FINAL;
725 template<
typename FT>
726 std::tr1::shared_ptr<const FT>
getField(std::string
const &fieldName)
const
728 STATIC_ASSERT(FT::isField);
729 return std::tr1::dynamic_pointer_cast<const FT>(getField(fieldName));
745 template<
typename FT>
746 std::tr1::shared_ptr<const FT>
getFieldT(std::string
const &fieldName)
const
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))
826 const std::string&
getFieldName(std::size_t fieldIndex)
const {
return fieldNames.at(fieldIndex);}
828 virtual std::string
getID() const OVERRIDE FINAL;
846 FieldConstPtr getFieldImpl(const
std::
string& fieldName,
bool throws) const;
860 POINTER_DEFINITIONS(
Union);
905 template<
typename FT>
906 std::tr1::shared_ptr<const FT>
getField(std::string
const &fieldName)
const
908 STATIC_ASSERT(FT::isField);
909 return std::tr1::dynamic_pointer_cast<const FT>(getField(fieldName));
925 template<
typename FT>
926 std::tr1::shared_ptr<const FT>
getFieldT(std::string
const &fieldName)
const
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))
1006 std::string
getFieldName(std::size_t fieldIndex)
const {
return fieldNames.at(fieldIndex);}
1024 virtual std::string
getID() const OVERRIDE FINAL;
1043 FieldConstPtr getFieldImpl(const
std::
string& fieldName,
bool throws) const;
1048 EPICS_NOT_COPYABLE(
Union)
1079 FieldBuilderPtr
setId(std::string
const &
id);
1095 FieldBuilderPtr
addBoundedString(std::string
const & name, std::size_t maxLength) PVD_DEPRECATED_52;
1206 FieldBuilder(
const FieldBuilderPtr & _parentBuilder,
const std::string& name,
const Union*);
1209 std::string
const & nestedName,
1210 Type nestedClassToBuild,
bool nestedArray);
1212 const Field *findField(
const std::string& name,
Type ftype);
1219 const FieldCreatePtr fieldCreate;
1227 const FieldBuilderPtr parentBuilder;
1228 const Type nestedClassToBuild;
1229 const std::string nestedName;
1230 const bool nestedArray;
1231 const bool createNested;
1235struct field_factory;
1243 friend struct detail::field_factory;
1318 std::string
const &
id,
1354 std::string
const &
id,
1366 std::string
const & fieldName,
FieldConstPtr const & field)
const;
1395 mutable Mutex mutex;
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}; };
1439OP(pvBoolean,
boolean)
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
valarray< size_t > size() const
basic_ostream< _CharT, _Traits > & operator<<(basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Alloc > &__str)
ios_base & fixed(ios_base &__base)
This class implements introspection object for Array.
virtual ArraySizeType getArraySizeType() const =0
virtual std::size_t getMaximumCapacity() const =0
This class implements introspection object for bounded scalar array.
virtual std::size_t getMaximumCapacity() const
virtual ArraySizeType getArraySizeType() const
virtual std::string getID() const
BoundedScalarArray(ScalarType scalarType, std::size_t size)
This class implements introspection object for BoundedString.
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.
This is a singleton class for creating introspection interfaces.
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
This class implements introspection object for bounded scalar array.
virtual std::size_t getMaximumCapacity() const
virtual ArraySizeType getArraySizeType() 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
ScalarArray(ScalarType scalarType)
virtual std::string getID() const
ScalarType getElementType() const
This class implements introspection object for Scalar.
virtual std::string getID() const
ScalarType getScalarType() const
Callback class for serialization.
Base class for serialization.
Standard Fields is a class or creating or sharing Field objects for standard fields.
This class implements introspection object for a structureArray.
virtual std::size_t getMaximumCapacity() const
virtual ArraySizeType getArraySizeType() const
virtual std::string getID() 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()
const FieldConstPtr & getField(std::size_t index) const
std::size_t getFieldIndex(std::string const &fieldName) const
std::size_t getNumberFields() const
FieldConstPtrArray const & getFields() 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
FieldConstPtr getField(std::string const &fieldName) const
const std::string & getFieldName(std::size_t fieldIndex) const
This class implements introspection object for a unionArray.
virtual ArraySizeType getArraySizeType() const
virtual std::size_t getMaximumCapacity() 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< 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::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
FieldConstPtr getFieldT(std::string const &fieldName) const
std::size_t getFieldIndex(std::string const &fieldName) const
std::size_t getNumberFields() 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
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)
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< 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