10 #define PVINTROSPECT_H 28 #if defined(PVD_INTERNAL) 29 # define PVD_DEPRECATED(msg) 30 #elif __GNUC__ > 4 || __GNUC__ == 4 && __GNUC_MINOR__ >= 5 31 # define PVD_DEPRECATED(msg) __attribute__((deprecated(msg))) 33 # define PVD_DEPRECATED(msg) EPICS_DEPRECATED 35 #define PVD_DEPRECATED_52 PVD_DEPRECATED("See https://github.com/epics-base/pvDataCPP/issues/52") 48 # if __cplusplus>=201103L 55 # if __cplusplus>=201103L 56 # define OVERRIDE override 62 namespace epics {
namespace pvData {
280 #define MAX_SCALAR_TYPE pvString 286 namespace ScalarTypeFunc {
338 public std::tr1::enable_shared_from_this<Field> {
353 virtual std::string getID()
const = 0;
360 virtual std::ostream& dump(std::ostream& o)
const = 0;
364 std::tr1::shared_ptr<PVField> build()
const;
376 const Type m_fieldType;
383 friend class PVFieldPvt;
385 friend class BasePVStructureArray;
409 virtual std::string getID()
const OVERRIDE;
411 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE
FINAL;
418 std::tr1::shared_ptr<PVScalar> build()
const;
448 std::
size_t getMaximumLength() const;
453 std::
size_t maxLength;
481 virtual std::size_t getMaximumCapacity()
const = 0;
518 virtual std::string getID()
const OVERRIDE;
520 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE
FINAL;
527 std::tr1::shared_ptr<PVScalarArray> build()
const;
531 const std::string getIDScalarArrayLUT()
const;
625 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE FINAL;
632 std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVStructure> > > build()
const;
643 StructureConstPtr pstructure;
670 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE FINAL;
677 std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVUnion> > > build()
const;
688 UnionConstPtr punion;
710 static const std::string & defaultId();
727 FieldConstPtr getField(std::string
const &fieldName)
const;
733 template<
typename FT>
734 std::tr1::shared_ptr<const FT>
getField(std::string
const &fieldName)
const 746 FieldConstPtr
getFieldT(std::string
const &fieldName)
const {
return getFieldImpl(fieldName,
true);};
753 template<
typename FT>
754 std::tr1::shared_ptr<const FT>
getFieldT(std::string
const &fieldName)
const 757 std::tr1::shared_ptr<const FT>
result(
758 std::tr1::dynamic_pointer_cast<const FT>(getFieldT(fieldName))
762 throw std::runtime_error(
"Wrong Field type");
772 const FieldConstPtr&
getField(std::size_t index)
const {
return fields.at(index);}
779 template<
typename FT>
780 std::tr1::shared_ptr<const FT>
getField(std::size_t index)
const 791 FieldConstPtr
getFieldT(std::size_t index)
const {
return fields.at(index);}
799 template<
typename FT>
800 std::tr1::shared_ptr<const FT>
getFieldT(std::size_t index)
const 803 std::tr1::shared_ptr<const FT>
result(
804 std::tr1::dynamic_pointer_cast<const FT>(getFieldT(index))
808 throw std::runtime_error(
"Wrong Field type");
818 std::size_t getFieldIndex(std::string
const &fieldName)
const;
823 FieldConstPtrArray
const &
getFields()
const {
return fields;}
834 const std::string&
getFieldName(std::size_t fieldIndex)
const {
return fieldNames.at(fieldIndex);}
838 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE FINAL;
845 std::tr1::shared_ptr<PVStructure> build()
const;
848 Structure(
StringArray const & fieldNames, FieldConstPtrArray
const & fields, std::string
const &
id = defaultId());
851 FieldConstPtrArray fields;
854 FieldConstPtr getFieldImpl(
const std::string& fieldName,
bool throws)
const;
855 void dumpFields(std::ostream& o)
const;
879 static const std::string & defaultId();
890 static const std::string & anyId();
907 FieldConstPtr getField(std::string
const &fieldName)
const;
913 template<
typename FT>
914 std::tr1::shared_ptr<const FT>
getField(std::string
const &fieldName)
const 926 FieldConstPtr
getFieldT(std::string
const &fieldName)
const {
return getFieldImpl(fieldName,
true);};
933 template<
typename FT>
934 std::tr1::shared_ptr<const FT>
getFieldT(std::string
const &fieldName)
const 937 std::tr1::shared_ptr<const FT>
result(
938 std::tr1::dynamic_pointer_cast<const FT>(getFieldT(fieldName))
942 throw std::runtime_error(
"Wrong Field type");
952 FieldConstPtr
getField(std::size_t index)
const {
return fields.at(index);}
959 template<
typename FT>
960 std::tr1::shared_ptr<const FT>
getField(std::size_t index)
const 971 FieldConstPtr
getFieldT(std::size_t index)
const {
return fields.at(index);}
979 template<
typename FT>
980 std::tr1::shared_ptr<const FT>
getFieldT(std::size_t index)
const 983 std::tr1::shared_ptr<const FT>
result(
984 std::tr1::dynamic_pointer_cast<const FT>(getFieldT(index))
988 throw std::runtime_error(
"Wrong Field type");
998 std::size_t getFieldIndex(std::string
const &fieldName)
const;
1003 FieldConstPtrArray
const &
getFields()
const {
return fields;}
1014 std::string
getFieldName(std::size_t fieldIndex)
const {
return fieldNames.at(fieldIndex);}
1034 virtual std::ostream& dump(std::ostream& o)
const OVERRIDE FINAL;
1041 std::tr1::shared_ptr<PVUnion> build()
const;
1045 Union(
StringArray const & fieldNames, FieldConstPtrArray
const & fields, std::string
const &
id = defaultId());
1048 FieldConstPtrArray fields;
1051 FieldConstPtr getFieldImpl(
const std::string& fieldName,
bool throws)
const;
1052 void dumpFields(std::ostream& o)
const;
1073 public std::tr1::enable_shared_from_this<FieldBuilder>
1078 static FieldBuilderPtr
begin();
1080 static FieldBuilderPtr
begin(StructureConstPtr S);
1087 FieldBuilderPtr setId(std::string
const &
id);
1095 FieldBuilderPtr add(std::string
const & name,
ScalarType scalarType);
1103 FieldBuilderPtr addBoundedString(std::string
const & name, std::size_t maxLength)
PVD_DEPRECATED_52;
1111 FieldBuilderPtr add(std::string
const & name, FieldConstPtr
const & field);
1119 FieldBuilderPtr addArray(std::string
const & name,
ScalarType scalarType);
1145 FieldBuilderPtr addArray(std::string
const & name, FieldConstPtr
const & element);
1152 StructureConstPtr createStructure();
1159 UnionConstPtr createUnion();
1169 FieldBuilderPtr addNestedStructure(std::string
const & name);
1179 FieldBuilderPtr addNestedUnion(std::string
const & name);
1189 FieldBuilderPtr addNestedStructureArray(std::string
const & name);
1199 FieldBuilderPtr addNestedUnionArray(std::string
const & name);
1207 FieldBuilderPtr endNested();
1214 FieldBuilder(
const FieldBuilderPtr & _parentBuilder,
const std::string& name,
const Union*);
1217 std::string
const & nestedName,
1218 Type nestedClassToBuild,
bool nestedArray);
1220 const Field *findField(
const std::string& name,
Type ftype);
1223 FieldConstPtr createFieldInternal(
Type type);
1227 const FieldCreatePtr fieldCreate;
1233 FieldConstPtrArray fields;
1235 const FieldBuilderPtr parentBuilder;
1236 const Type nestedClassToBuild;
1237 const std::string nestedName;
1238 const bool nestedArray;
1239 const bool createNested;
1243 struct field_factory;
1258 FieldBuilderPtr createFieldBuilder()
const;
1263 FieldBuilderPtr createFieldBuilder(StructureConstPtr S)
const;
1270 ScalarConstPtr createScalar(
ScalarType scalarType)
const;
1277 BoundedStringConstPtr createBoundedString(std::size_t maxLength)
const PVD_DEPRECATED_52;
1283 ScalarArrayConstPtr createScalarArray(
ScalarType elementType)
const;
1303 StructureArrayConstPtr createStructureArray(StructureConstPtr
const &
structure)
const;
1308 StructureConstPtr createStructure ()
const;
1315 StructureConstPtr createStructure (
1317 FieldConstPtrArray
const & fields)
const;
1325 StructureConstPtr createStructure (
1326 std::string
const &
id,
1328 FieldConstPtrArray
const & fields)
const;
1334 UnionArrayConstPtr createUnionArray(UnionConstPtr
const & punion)
const;
1339 UnionArrayConstPtr createVariantUnionArray()
const;
1344 UnionConstPtr createVariantUnion()
const;
1351 UnionConstPtr createUnion (
1353 FieldConstPtrArray
const & fields)
const;
1361 UnionConstPtr createUnion (
1362 std::string
const &
id,
1364 FieldConstPtrArray
const & fields)
const;
1372 StructureConstPtr appendField(
1374 std::string
const & fieldName, FieldConstPtr
const & field)
const;
1382 StructureConstPtr appendFields(
1385 FieldConstPtrArray
const & fields)
const;
1398 std::vector<ScalarConstPtr> scalars;
1399 std::vector<ScalarArrayConstPtr> scalarArrays;
1400 UnionConstPtr variantUnion;
1401 UnionArrayConstPtr variantUnionArray;
1404 typedef std::multimap<unsigned int, Field*> cache_t;
1405 mutable cache_t
cache;
1430 template<
typename T>
1439 template<ScalarType ID>
1442 #define OP(ENUM, TYPE) \ 1443 template<> struct ScalarTypeTraits<ENUM> {typedef TYPE type;}; \ 1444 template<> struct ScalarTypeID<TYPE> { enum {value=ENUM}; }; \ 1445 template<> struct ScalarTypeID<const TYPE> { enum {value=ENUM}; }; 1476 #define MAKE_COMPARE(CLASS) \ 1477 static FORCE_INLINE bool operator==(const CLASS& a, const CLASS& b) {return (void*)&a==(void*)&b;} \ 1478 static FORCE_INLINE bool operator!=(const CLASS& a, const CLASS& b) {return !(a==b);} virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
This class implements introspection object for Scalar.
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
PVScalar is the base class for each scalar field.
This class implements introspection object for a union.
const std::string & getFieldName(std::size_t fieldIndex) const
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
size_t elementSize(ScalarType id)
gives sizeof(T) where T depends on the scalar type id.
FieldConstPtr getFieldT(std::string const &fieldName) const
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
An EPICS-specific replacement for ANSI C's assert.
std::size_t getNumberFields() const
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
FieldConstPtr getFieldT(std::string const &fieldName) const
BoundedString & reference
Base class for serialization.
std::tr1::shared_ptr< const Array > ArrayConstPtr
#define PVD_DEPRECATED_52
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
const FixedScalarArray & const_reference
pvd::StructureConstPtr type
const StructureConstPtr & getStructure() const
TODO only here because of the Lockable.
std::size_t getNumberFields() const
std::tr1::shared_ptr< const Structure > StructureConstPtr
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
const ScalarArray & const_reference
FieldConstPtrArray const & getFields() const
ScalarType getElementType() const
Mark external symbols and entry points for shared libraries.
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
Callback class for deserialization.
PVField is the base class for each PVData field.
static const std::string DEFAULT_ID
Interface for in-line creating of introspection interfaces.
const BoundedString & const_reference
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
This class implements introspection object for bounded scalar array.
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
FieldConstPtr getFieldT(std::size_t index) const
This class implements introspection object for field.
const UnionArray & const_reference
bool isPrimitive(ScalarType type)
std::tr1::shared_ptr< const Union > UnionConstPtr
This class implements introspection object for a structure.
#define POINTER_DEFINITIONS(clazz)
const FieldConstPtr & getField(std::size_t index) const
#define STATIC_ASSERT(expr)
Declare a condition that should be true at compile-time.
template class for all extensions of PVArray.
bool compare(const Field &a, const Field &b)
std::tr1::shared_ptr< const BoundedString > BoundedStringConstPtr
bool isNumeric(ScalarType type)
This class implements introspection object for Array.
const Structure & const_reference
Base class for a scalarArray.
epicsShareExtern ScalarType getScalarType(std::string const &value)
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
StringArray const & getFieldNames() const
FieldConstPtr getFieldT(std::size_t index) const
const Scalar & const_reference
PVUnion has a single subfield.
std::vector< FieldConstPtr > FieldConstPtrArray
This class implements introspection object for BoundedString.
This class implements introspection object for a unionArray.
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
Data interface for a structure,.
std::tr1::shared_ptr< const Field > FieldConstPtr
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
FixedScalarArray & reference
This is a singleton class for creating introspection interfaces.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
static size_t num_instances
const BoundedScalarArray & const_reference
bool isInteger(ScalarType type)
std::tr1::shared_ptr< const ScalarArray > ScalarArrayConstPtr
This class implements introspection object for scalar array.
This class implements introspection object for a structureArray.
virtual std::size_t getMaximumCapacity() const OVERRIDE
const Union & const_reference
UnionConstPtr getUnion() const
StructureArray & reference
std::vector< std::string > StringArray
static const std::string ANY_ID
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
const StructureArray & const_reference
This class implements introspection object for bounded scalar array.
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
const Array & const_reference
Callback class for serialization.
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
FieldConstPtrArray const & getFields() const
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
Standard Fields is a class or creating or sharing Field objects for standard fields.
ScalarType getScalarType() const
bool isUInteger(ScalarType type)
BoundedScalarArray & reference
#define EPICS_NOT_COPYABLE(CLASS)
Disable implicit copyable.
std::string getFieldName(std::size_t fieldIndex) const
#define MAKE_COMPARE(CLASS)
FieldConstPtr getField(std::size_t index) const
static const FieldCreatePtr & getFieldCreate()
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
static const std::string DEFAULT_ID
virtual ArraySizeType getArraySizeType() const OVERRIDE
StringArray const & getFieldNames() const
std::tr1::shared_ptr< const UnionArray > UnionArrayConstPtr