This is Unofficial EPICS BASE Doxygen Site
pvIntrospect.h
Go to the documentation of this file.
1 /* pvIntrospect.h */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
9 #ifndef PVINTROSPECT_H
10 #define PVINTROSPECT_H
11 
12 #include <string>
13 #include <stdexcept>
14 #include <iostream>
15 #include <map>
16 
17 #include <epicsAssert.h>
18 
19 #include <pv/lock.h>
20 #include <pv/noDefaultMethods.h>
21 #include <pv/pvType.h>
22 #include <pv/byteBuffer.h>
23 #include <pv/serialize.h>
24 #include <pv/pvdVersion.h>
25 
26 #include <shareLib.h>
27 
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)))
32 #else
33 # define PVD_DEPRECATED(msg) EPICS_DEPRECATED
34 #endif
35 #define PVD_DEPRECATED_52 PVD_DEPRECATED("See https://github.com/epics-base/pvDataCPP/issues/52")
36 
37 /* C++11 keywords
38  @code
39  struct Base {
40  virtual void foo();
41  };
42  struct Class : public Base {
43  virtual void foo() OVERRIDE FINAL;
44  };
45  @endcode
46  */
47 #ifndef FINAL
48 # if __cplusplus>=201103L
49 # define FINAL final
50 # else
51 # define FINAL
52 # endif
53 #endif
54 #ifndef OVERRIDE
55 # if __cplusplus>=201103L
56 # define OVERRIDE override
57 # else
58 # define OVERRIDE
59 # endif
60 #endif
61 
62 namespace epics { namespace pvData {
63 
64 namespace format {
65 
67 {
68  long level;
69 
70  indent_level(long l) : level(l) {}
71 };
72 
73 epicsShareExtern long& indent_value(std::ios_base& ios);
74 
75 epicsShareExtern std::ostream& operator<<(std::ostream& os, indent_level const& indent);
76 
78 {
80  std::ios_base& stream;
81 
82  indent_scope(std::ios_base& ios) :
83  stream(ios)
84  {
85  long& l = indent_value(ios);
86  saved_level = l;
87  l = saved_level + 1;
88  }
89 
91  {
92  indent_value(stream) = saved_level;
93  }
94 };
95 
96 struct indent
97 {
98 };
99 
100 epicsShareExtern std::ostream& operator<<(std::ostream& os, indent const&);
101 
102 struct array_at
103 {
104  std::size_t index;
105 
106  array_at(std::size_t ix) : index(ix) {}
107 };
108 
110 {
111  std::size_t index;
112  std::ostream& stream;
113 
114  array_at_internal(std::size_t ix, std::ostream& str) : index(ix), stream(str) {}
115 };
116 
117 epicsShareExtern array_at_internal operator<<(std::ostream& str, array_at const& manip);
118 
119 };
120 
121 class Field;
122 class Scalar;
123 class Array;
124 class ScalarArray;
125 class Structure;
126 class StructureArray;
127 class Union;
128 class UnionArray;
129 
130 class BoundedString;
131 
132 class PVField;
133 class PVScalar;
134 class PVScalarArray;
135 class PVStructure;
136 class PVUnion;
137 template<typename T> class PVValueArray;
138 
142 typedef std::tr1::shared_ptr<const Field> FieldConstPtr;
146 typedef std::vector<FieldConstPtr> FieldConstPtrArray;
150 typedef std::tr1::shared_ptr<const Scalar> ScalarConstPtr;
154 typedef std::tr1::shared_ptr<const Array> ArrayConstPtr;
158 typedef std::tr1::shared_ptr<const ScalarArray> ScalarArrayConstPtr;
162 typedef std::tr1::shared_ptr<const Structure> StructureConstPtr;
166 typedef std::tr1::shared_ptr<const StructureArray> StructureArrayConstPtr;
170 typedef std::tr1::shared_ptr<const Union> UnionConstPtr;
174 typedef std::tr1::shared_ptr<const UnionArray> UnionArrayConstPtr;
178 typedef std::tr1::shared_ptr<const BoundedString> BoundedStringConstPtr;
179 
183 enum Type {
208 };
209 
214 namespace TypeFunc {
220  epicsShareExtern const char* name(Type type);
221 };
222 
223 epicsShareExtern std::ostream& operator<<(std::ostream& o, const Type& type);
224 
225 
278 };
279 
280 #define MAX_SCALAR_TYPE pvString
281 
286 namespace ScalarTypeFunc {
292  epicsShareExtern bool isInteger(ScalarType scalarType);
298  epicsShareExtern bool isUInteger(ScalarType scalarType);
304  epicsShareExtern bool isNumeric(ScalarType scalarType);
310  epicsShareExtern bool isPrimitive(ScalarType scalarType);
317  epicsShareExtern ScalarType getScalarType(std::string const &value);
323  epicsShareExtern const char* name(ScalarType scalarType);
324 
327 };
328 
329 epicsShareExtern std::ostream& operator<<(std::ostream& o, const ScalarType& scalarType);
330 
331 
337  virtual public Serializable,
338  public std::tr1::enable_shared_from_this<Field> {
339 public:
340  static size_t num_instances;
341 
343  virtual ~Field();
348  Type getType() const{return m_fieldType;}
353  virtual std::string getID() const = 0;
354 
360  virtual std::ostream& dump(std::ostream& o) const = 0;
361 
364  std::tr1::shared_ptr<PVField> build() const;
365 
366  enum {isField=1};
367 
368 protected:
373  Field(Type type);
374  void cacheCleanup();
375 private:
376  const Type m_fieldType;
377  unsigned int m_hash;
378  struct Helper;
379  friend struct Helper;
380 
381  friend class StructureArray;
382  friend class Structure;
383  friend class PVFieldPvt;
384  friend class StandardField;
385  friend class BasePVStructureArray;
386  friend class FieldCreate;
388 };
389 
390 epicsShareExtern std::ostream& operator<<(std::ostream& o, const Field& field);
391 
392 
397 class epicsShareClass Scalar : public Field{
398 public:
400  virtual ~Scalar();
401  typedef Scalar& reference;
402  typedef const Scalar& const_reference;
407  ScalarType getScalarType() const {return scalarType;}
408 
409  virtual std::string getID() const OVERRIDE;
410 
411  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
412 
413  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE;
414  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
415 
418  std::tr1::shared_ptr<PVScalar> build() const;
419 
420 protected:
421  Scalar(ScalarType scalarType);
422 private:
423  static int8 getTypeCodeLUT(ScalarType scalarType);
424  ScalarType scalarType;
425  friend class FieldCreate;
426  friend class ScalarArray;
427  friend class BoundedScalarArray;
428  friend class FixedScalarArray;
429  friend class BoundedString;
431 };
432 
438 public:
440  virtual ~BoundedString();
443 
444  virtual std::string getID() const OVERRIDE FINAL;
445 
446  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
447 
448  std::size_t getMaximumLength() const;
449 
450 protected:
451  BoundedString(std::size_t maxStringLength);
452 private:
453  std::size_t maxLength;
454  friend class FieldCreate;
456 };
457 
462 class epicsShareClass Array : public Field{
463 public:
465  virtual ~Array();
466  typedef Array& reference;
467  typedef const Array& const_reference;
468 
469  enum ArraySizeType { variable, fixed, bounded };
470 
475  virtual ArraySizeType getArraySizeType() const = 0;
476 
481  virtual std::size_t getMaximumCapacity() const = 0;
482 
483 protected:
488  Array(Type type);
489 
491 };
492 
498 public:
501  typedef const ScalarArray& const_reference;
502 
507  ScalarArray(ScalarType scalarType);
512  ScalarType getElementType() const {return elementType;}
513 
515 
516  virtual std::size_t getMaximumCapacity() const OVERRIDE {return 0;}
517 
518  virtual std::string getID() const OVERRIDE;
519 
520  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
521 
522  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE;
523  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
524 
527  std::tr1::shared_ptr<PVScalarArray> build() const;
528 
529  virtual ~ScalarArray();
530 private:
531  const std::string getIDScalarArrayLUT() const;
532  ScalarType elementType;
533  friend class FieldCreate;
535 };
536 
537 
538 
544 public:
548 
554  BoundedScalarArray(ScalarType scalarType, std::size_t size);
555 
557 
558  virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL {return size;}
559 
560  virtual std::string getID() const OVERRIDE FINAL;
561 
562  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
563 
564  virtual ~BoundedScalarArray();
565 private:
566  std::size_t size;
567  friend class FieldCreate;
569 };
570 
576 public:
580 
586  FixedScalarArray(ScalarType scalarType, std::size_t size);
587 
589 
590  virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL {return size;}
591 
592  virtual std::string getID() const OVERRIDE FINAL;
593 
594  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
595 
596  virtual ~FixedScalarArray();
597 private:
598  std::size_t size;
599  friend class FieldCreate;
601 };
602 
608 public:
612 
617  const StructureConstPtr& getStructure() const {return pstructure;}
618 
620 
621  virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL {return 0;}
622 
623  virtual std::string getID() const OVERRIDE FINAL;
624 
625  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
626 
627  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
628  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
629 
632  std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVStructure> > > build() const;
633 
634 protected:
639  StructureArray(StructureConstPtr const & structure);
640 public:
641  virtual ~StructureArray();
642 private:
643  StructureConstPtr pstructure;
644  friend class FieldCreate;
646 };
647 
653 public:
656  typedef const UnionArray& const_reference;
657 
662  UnionConstPtr getUnion() const {return punion;}
663 
665 
666  virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL {return 0;}
667 
668  virtual std::string getID() const OVERRIDE FINAL;
669 
670  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
671 
672  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
673  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
674 
677  std::tr1::shared_ptr<PVValueArray<std::tr1::shared_ptr<PVUnion> > > build() const;
678 
679 protected:
684  UnionArray(UnionConstPtr const & _punion);
685 public:
686  virtual ~UnionArray();
687 private:
688  UnionConstPtr punion;
689  friend class FieldCreate;
691 };
692 
698 public:
700 
704  static const std::string DEFAULT_ID;
705 
710  static const std::string & defaultId();
711 
712  virtual ~Structure();
714  typedef const Structure& const_reference;
715 
720  std::size_t getNumberFields() const {return fieldNames.size();}
721 
727  FieldConstPtr getField(std::string const &fieldName) const;
728 
733  template<typename FT>
734  std::tr1::shared_ptr<const FT> getField(std::string const &fieldName) const
735  {
736  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
737  return std::tr1::dynamic_pointer_cast<const FT>(getField(fieldName));
738  }
739 
746  FieldConstPtr getFieldT(std::string const &fieldName) const {return getFieldImpl(fieldName, true);};
747 
753  template<typename FT>
754  std::tr1::shared_ptr<const FT> getFieldT(std::string const &fieldName) const
755  {
756  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
757  std::tr1::shared_ptr<const FT> result(
758  std::tr1::dynamic_pointer_cast<const FT>(getFieldT(fieldName))
759  );
760 
761  if (!result)
762  throw std::runtime_error("Wrong Field type");
763 
764  return result;
765  }
766 
772  const FieldConstPtr& getField(std::size_t index) const {return fields.at(index);}
773 
779  template<typename FT>
780  std::tr1::shared_ptr<const FT> getField(std::size_t index) const
781  {
782  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
783  return std::tr1::dynamic_pointer_cast<const FT>(getField(index));
784  }
785 
791  FieldConstPtr getFieldT(std::size_t index) const {return fields.at(index);}
792 
799  template<typename FT>
800  std::tr1::shared_ptr<const FT> getFieldT(std::size_t index) const
801  {
802  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
803  std::tr1::shared_ptr<const FT> result(
804  std::tr1::dynamic_pointer_cast<const FT>(getFieldT(index))
805  );
806 
807  if (!result)
808  throw std::runtime_error("Wrong Field type");
809 
810  return result;
811  }
812 
818  std::size_t getFieldIndex(std::string const &fieldName) const;
823  FieldConstPtrArray const & getFields() const {return fields;}
828  StringArray const & getFieldNames() const {return fieldNames;}
834  const std::string& getFieldName(std::size_t fieldIndex) const {return fieldNames.at(fieldIndex);}
835 
836  virtual std::string getID() const OVERRIDE FINAL;
837 
838  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
839 
840  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
841  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
842 
845  std::tr1::shared_ptr<PVStructure> build() const;
846 
847 protected:
848  Structure(StringArray const & fieldNames, FieldConstPtrArray const & fields, std::string const & id = defaultId());
849 private:
850  StringArray fieldNames;
851  FieldConstPtrArray fields;
852  std::string id;
853 
854  FieldConstPtr getFieldImpl(const std::string& fieldName, bool throws) const;
855  void dumpFields(std::ostream& o) const;
856 
857  friend class FieldCreate;
858  friend class Union;
860 };
861 
866 class epicsShareClass Union : public Field {
867 public:
869 
873  static const std::string DEFAULT_ID;
874 
879  static const std::string & defaultId();
880 
884  static const std::string ANY_ID;
885 
890  static const std::string & anyId();
891 
892  virtual ~Union();
893  typedef Union& reference;
894  typedef const Union& const_reference;
895 
900  std::size_t getNumberFields() const {return fieldNames.size();}
901 
907  FieldConstPtr getField(std::string const &fieldName) const;
908 
913  template<typename FT>
914  std::tr1::shared_ptr<const FT> getField(std::string const &fieldName) const
915  {
916  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
917  return std::tr1::dynamic_pointer_cast<const FT>(getField(fieldName));
918  }
919 
926  FieldConstPtr getFieldT(std::string const &fieldName) const {return getFieldImpl(fieldName, true);};
927 
933  template<typename FT>
934  std::tr1::shared_ptr<const FT> getFieldT(std::string const &fieldName) const
935  {
936  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
937  std::tr1::shared_ptr<const FT> result(
938  std::tr1::dynamic_pointer_cast<const FT>(getFieldT(fieldName))
939  );
940 
941  if (!result)
942  throw std::runtime_error("Wrong Field type");
943 
944  return result;
945  }
946 
952  FieldConstPtr getField(std::size_t index) const {return fields.at(index);}
953 
959  template<typename FT>
960  std::tr1::shared_ptr<const FT> getField(std::size_t index) const
961  {
962  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
963  return std::tr1::dynamic_pointer_cast<const FT>(getField(index));
964  }
965 
971  FieldConstPtr getFieldT(std::size_t index) const {return fields.at(index);}
972 
979  template<typename FT>
980  std::tr1::shared_ptr<const FT> getFieldT(std::size_t index) const
981  {
982  STATIC_ASSERT(FT::isField); // only allow cast from Field sub-class
983  std::tr1::shared_ptr<const FT> result(
984  std::tr1::dynamic_pointer_cast<const FT>(getFieldT(index))
985  );
986 
987  if (!result)
988  throw std::runtime_error("Wrong Field type");
989 
990  return result;
991  }
992 
998  std::size_t getFieldIndex(std::string const &fieldName) const;
1003  FieldConstPtrArray const & getFields() const {return fields;}
1008  StringArray const & getFieldNames() const {return fieldNames;}
1014  std::string getFieldName(std::size_t fieldIndex) const {return fieldNames.at(fieldIndex);}
1019  bool isVariant() const {return (fieldNames.size() == 0);}
1020 
1030  int32 guess(Type t, ScalarType s) const;
1031 
1032  virtual std::string getID() const OVERRIDE FINAL;
1033 
1034  virtual std::ostream& dump(std::ostream& o) const OVERRIDE FINAL;
1035 
1036  virtual void serialize(ByteBuffer *buffer, SerializableControl *control) const OVERRIDE FINAL;
1037  virtual void deserialize(ByteBuffer *buffer, DeserializableControl *control) OVERRIDE FINAL;
1038 
1041  std::tr1::shared_ptr<PVUnion> build() const;
1042 
1043 protected:
1044  Union();
1045  Union(StringArray const & fieldNames, FieldConstPtrArray const & fields, std::string const & id = defaultId());
1046 private:
1047  StringArray fieldNames;
1048  FieldConstPtrArray fields;
1049  std::string id;
1050 
1051  FieldConstPtr getFieldImpl(const std::string& fieldName, bool throws) const;
1052  void dumpFields(std::ostream& o) const;
1053 
1054  friend class FieldCreate;
1055  friend class Structure;
1057 };
1058 
1060 typedef std::tr1::shared_ptr<FieldCreate> FieldCreatePtr;
1061 
1063 typedef std::tr1::shared_ptr<FieldBuilder> FieldBuilderPtr;
1064 
1073  public std::tr1::enable_shared_from_this<FieldBuilder>
1074 {
1075 public:
1078  static FieldBuilderPtr begin();
1080  static FieldBuilderPtr begin(StructureConstPtr S);
1081 
1087  FieldBuilderPtr setId(std::string const & id);
1088 
1095  FieldBuilderPtr add(std::string const & name, ScalarType scalarType);
1096 
1103  FieldBuilderPtr addBoundedString(std::string const & name, std::size_t maxLength) PVD_DEPRECATED_52;
1104 
1111  FieldBuilderPtr add(std::string const & name, FieldConstPtr const & field);
1112 
1119  FieldBuilderPtr addArray(std::string const & name, ScalarType scalarType);
1120 
1128  FieldBuilderPtr addFixedArray(std::string const & name, ScalarType scalarType, std::size_t size) PVD_DEPRECATED_52;
1129 
1137  FieldBuilderPtr addBoundedArray(std::string const & name, ScalarType scalarType, std::size_t bound) PVD_DEPRECATED_52;
1138 
1145  FieldBuilderPtr addArray(std::string const & name, FieldConstPtr const & element);
1146 
1152  StructureConstPtr createStructure();
1153 
1159  UnionConstPtr createUnion();
1160 
1169  FieldBuilderPtr addNestedStructure(std::string const & name);
1170 
1179  FieldBuilderPtr addNestedUnion(std::string const & name);
1180 
1189  FieldBuilderPtr addNestedStructureArray(std::string const & name);
1190 
1199  FieldBuilderPtr addNestedUnionArray(std::string const & name);
1200 
1207  FieldBuilderPtr endNested();
1208 
1209 private:
1210  FieldBuilder();
1211  FieldBuilder(const Structure*);
1212  FieldBuilder(const FieldBuilderPtr & _parentBuilder, const std::string& name, const Structure*);
1213  FieldBuilder(const FieldBuilderPtr & _parentBuilder, const std::string& name, const StructureArray*);
1214  FieldBuilder(const FieldBuilderPtr & _parentBuilder, const std::string& name, const Union*);
1215  FieldBuilder(const FieldBuilderPtr & _parentBuilder, const std::string& name, const UnionArray*);
1216  FieldBuilder(FieldBuilderPtr const & parentBuilder,
1217  std::string const & nestedName,
1218  Type nestedClassToBuild, bool nestedArray);
1219 
1220  const Field *findField(const std::string& name, Type ftype);
1221 
1222  void reset();
1223  FieldConstPtr createFieldInternal(Type type);
1224 
1225  friend class FieldCreate;
1226 
1227  const FieldCreatePtr fieldCreate;
1228 
1229  std::string id;
1230  bool idSet;
1231 
1232  StringArray fieldNames;
1233  FieldConstPtrArray fields;
1234 
1235  const FieldBuilderPtr parentBuilder;
1236  const Type nestedClassToBuild;
1237  const std::string nestedName;
1238  const bool nestedArray;
1239  const bool createNested; // true - endNested() creates in parent, false - endNested() appends to parent
1240 };
1241 
1242 namespace detail {
1243 struct field_factory;
1244 }
1245 
1251  friend struct detail::field_factory;
1252 public:
1253  static const FieldCreatePtr &getFieldCreate();
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;
1284  /*
1285  * Create an @c Array field, fixed size array.
1286  * @param elementType The @c ScalarType for array elements
1287  * @param size Fixed array size.
1288  * @return An @c Array Interface for the newly created object.
1289  */
1290  ScalarArrayConstPtr createFixedScalarArray(ScalarType elementType, std::size_t size) const PVD_DEPRECATED_52;
1297  ScalarArrayConstPtr createBoundedScalarArray(ScalarType elementType, std::size_t bound) const PVD_DEPRECATED_52;
1303  StructureArrayConstPtr createStructureArray(StructureConstPtr const & structure) const;
1308  StructureConstPtr createStructure () const;
1315  StructureConstPtr createStructure (
1316  StringArray const & fieldNames,
1317  FieldConstPtrArray const & fields) const;
1325  StructureConstPtr createStructure (
1326  std::string const & id,
1327  StringArray const & fieldNames,
1328  FieldConstPtrArray const & fields) const;
1334  UnionArrayConstPtr createUnionArray(UnionConstPtr const & punion) const;
1339  UnionArrayConstPtr createVariantUnionArray() const;
1344  UnionConstPtr createVariantUnion() const;
1351  UnionConstPtr createUnion (
1352  StringArray const & fieldNames,
1353  FieldConstPtrArray const & fields) const;
1361  UnionConstPtr createUnion (
1362  std::string const & id,
1363  StringArray const & fieldNames,
1364  FieldConstPtrArray const & fields) const;
1372  StructureConstPtr appendField(
1373  StructureConstPtr const & structure,
1374  std::string const & fieldName, FieldConstPtr const & field) const;
1382  StructureConstPtr appendFields(
1383  StructureConstPtr const & structure,
1384  StringArray const & fieldNames,
1385  FieldConstPtrArray const & fields) const;
1392  FieldConstPtr deserialize(ByteBuffer* buffer, DeserializableControl* control) const;
1393 
1394 private:
1395  FieldCreate();
1396 
1397  // const after ctor
1398  std::vector<ScalarConstPtr> scalars;
1399  std::vector<ScalarArrayConstPtr> scalarArrays;
1400  UnionConstPtr variantUnion;
1401  UnionArrayConstPtr variantUnionArray;
1402 
1403  mutable Mutex mutex;
1404  typedef std::multimap<unsigned int, Field*> cache_t;
1405  mutable cache_t cache;
1406 
1407  struct Helper;
1408  friend class Field;
1410 };
1411 
1416 FORCE_INLINE const FieldCreatePtr& getFieldCreate() {
1417  return FieldCreate::getFieldCreate();
1418 }
1419 
1430 template<typename T>
1431 struct ScalarTypeID {};
1432 
1439 template<ScalarType ID>
1441 
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}; };
1446 
1447 OP(pvBoolean, boolean)
1448 OP(pvByte, int8)
1449 OP(pvShort, int16)
1450 OP(pvInt, int32)
1451 OP(pvLong, int64)
1452 OP(pvUByte, uint8)
1453 OP(pvUShort, uint16)
1454 OP(pvUInt, uint32)
1455 OP(pvULong, uint64)
1456 OP(pvFloat, float)
1457 OP(pvDouble, double)
1458 OP(pvString, std::string)
1459 #undef OP
1460 
1461 bool epicsShareExtern compare(const Field&, const Field&);
1462 bool epicsShareExtern compare(const Scalar&, const Scalar&);
1463 bool epicsShareExtern compare(const ScalarArray&, const ScalarArray&);
1464 bool epicsShareExtern compare(const Structure&, const Structure&);
1465 bool epicsShareExtern compare(const StructureArray&, const StructureArray&);
1466 bool epicsShareExtern compare(const Union&, const Union&);
1467 bool epicsShareExtern compare(const UnionArray&, const UnionArray&);
1468 bool epicsShareExtern compare(const BoundedString&, const BoundedString&);
1469 
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);}
1479 
1480 MAKE_COMPARE(Field)
1481 MAKE_COMPARE(Scalar)
1482 MAKE_COMPARE(ScalarArray)
1483 MAKE_COMPARE(Structure)
1484 MAKE_COMPARE(StructureArray)
1485 MAKE_COMPARE(Union)
1486 MAKE_COMPARE(UnionArray)
1487 MAKE_COMPARE(BoundedString)
1488 
1489 #undef MAKE_COMPARE
1490 }}
1491 
1495 namespace std{
1496  epicsShareExtern std::ostream& operator<<(std::ostream& o, const epics::pvData::Field *ptr);
1497 }
1498 
1499 #endif /* PVINTROSPECT_H */
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
Definition: pvIntrospect.h:556
int8_t int8
Definition: pvType.h:75
std::ostream & operator<<(std::ostream &os, indent_level const &indent)
Definition: printer.cpp:35
This class implements introspection object for Scalar.
Definition: pvIntrospect.h:397
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
Definition: pvIntrospect.h:934
Definition: link.h:174
PVScalar is the base class for each scalar field.
Definition: pvData.h:272
This class implements introspection object for a union.
Definition: pvIntrospect.h:866
pvac::PutEvent result
Definition: clientSync.cpp:117
const std::string & getFieldName(std::size_t fieldIndex) const
Definition: pvIntrospect.h:834
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
Definition: pvIntrospect.h:621
size_t elementSize(ScalarType id)
gives sizeof(T) where T depends on the scalar type id.
Definition: TypeFunc.cpp:82
FieldConstPtr getFieldT(std::string const &fieldName) const
Definition: pvIntrospect.h:746
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
Definition: pvIntrospect.h:664
An EPICS-specific replacement for ANSI C&#39;s assert.
std::size_t getNumberFields() const
Definition: pvIntrospect.h:720
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
Definition: pvIntrospect.h:780
uint16_t uint16
Definition: pvType.h:95
FieldConstPtr getFieldT(std::string const &fieldName) const
Definition: pvIntrospect.h:926
char * cache
Definition: reader.c:18
Base class for serialization.
Definition: serialize.h:140
std::tr1::shared_ptr< const Array > ArrayConstPtr
Definition: pvIntrospect.h:154
#define PVD_DEPRECATED_52
Definition: pvIntrospect.h:35
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
Definition: pvIntrospect.h:734
const FixedScalarArray & const_reference
Definition: pvIntrospect.h:579
#define OVERRIDE
Definition: pvIntrospect.h:58
pvd::StructureConstPtr type
const StructureConstPtr & getStructure() const
Definition: pvIntrospect.h:617
Definition: memory.hpp:41
TODO only here because of the Lockable.
Definition: ntaggregate.cpp:16
indent_scope(std::ios_base &ios)
Definition: pvIntrospect.h:82
std::size_t getNumberFields() const
Definition: pvIntrospect.h:900
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
Definition: pvIntrospect.h:166
const ScalarArray & const_reference
Definition: pvIntrospect.h:501
FieldConstPtrArray const & getFields() const
Definition: pvIntrospect.h:823
ScalarType getElementType() const
Definition: pvIntrospect.h:512
Mark external symbols and entry points for shared libraries.
std::tr1::shared_ptr< const FT > getField(std::string const &fieldName) const
Definition: pvIntrospect.h:914
#define str(v)
Callback class for deserialization.
Definition: serialize.h:89
PVField is the base class for each PVData field.
Definition: pvData.h:152
epicsTime begin
Definition: caConnTest.cpp:22
static const std::string DEFAULT_ID
Definition: pvIntrospect.h:873
Interface for in-line creating of introspection interfaces.
const BoundedString & const_reference
Definition: pvIntrospect.h:442
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
array_at_internal(std::size_t ix, std::ostream &str)
Definition: pvIntrospect.h:114
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
Definition: pvIntrospect.h:619
This class implements introspection object for bounded scalar array.
Definition: pvIntrospect.h:575
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
Definition: pvIntrospect.h:666
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
Definition: pvIntrospect.h:800
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
Definition: pvIntrospect.h:150
FieldConstPtr getFieldT(std::size_t index) const
Definition: pvIntrospect.h:971
This class implements introspection object for field.
Definition: pvIntrospect.h:336
#define epicsShareExtern
Definition: shareLib.h:204
uint64_t uint64
Definition: pvType.h:103
const UnionArray & const_reference
Definition: pvIntrospect.h:656
bool isPrimitive(ScalarType type)
Definition: TypeFunc.cpp:58
Type getType() const
Definition: pvIntrospect.h:348
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
This class implements introspection object for a structure.
Definition: pvIntrospect.h:697
#define POINTER_DEFINITIONS(clazz)
Definition: sharedPtr.h:198
const FieldConstPtr & getField(std::size_t index) const
Definition: pvIntrospect.h:772
#define STATIC_ASSERT(expr)
Declare a condition that should be true at compile-time.
Definition: epicsAssert.h:86
template class for all extensions of PVArray.
Definition: pvData.h:55
epicsMutex mutex
Definition: pvAccess.cpp:71
bool compare(const Field &a, const Field &b)
Definition: Compare.cpp:26
std::tr1::shared_ptr< const BoundedString > BoundedStringConstPtr
Definition: pvIntrospect.h:178
bool isNumeric(ScalarType type)
Definition: TypeFunc.cpp:53
This class implements introspection object for Array.
Definition: pvIntrospect.h:462
const Structure & const_reference
Definition: pvIntrospect.h:714
#define epicsShareClass
Definition: shareLib.h:206
Base class for a scalarArray.
Definition: pvData.h:618
epicsShareExtern ScalarType getScalarType(std::string const &value)
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Definition: byteBuffer.h:233
StringArray const & getFieldNames() const
FieldConstPtr getFieldT(std::size_t index) const
Definition: pvIntrospect.h:791
const Scalar & const_reference
Definition: pvIntrospect.h:402
PVUnion has a single subfield.
Definition: pvData.h:940
std::vector< FieldConstPtr > FieldConstPtrArray
Definition: pvIntrospect.h:146
This class implements introspection object for BoundedString.
Definition: pvIntrospect.h:437
This class implements introspection object for a unionArray.
Definition: pvIntrospect.h:652
std::tr1::shared_ptr< const FT > getFieldT(std::size_t index) const
Definition: pvIntrospect.h:980
Data interface for a structure,.
Definition: pvData.h:712
std::tr1::shared_ptr< const Field > FieldConstPtr
Definition: pvIntrospect.h:137
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
Definition: pvIntrospect.h:590
FixedScalarArray & reference
Definition: pvIntrospect.h:578
This is a singleton class for creating introspection interfaces.
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
static size_t num_instances
Definition: pvIntrospect.h:340
const BoundedScalarArray & const_reference
Definition: pvIntrospect.h:547
bool isInteger(ScalarType type)
Definition: TypeFunc.cpp:43
std::tr1::shared_ptr< const ScalarArray > ScalarArrayConstPtr
Definition: pvIntrospect.h:158
This class implements introspection object for scalar array.
Definition: pvIntrospect.h:497
This class implements introspection object for a structureArray.
Definition: pvIntrospect.h:607
virtual std::size_t getMaximumCapacity() const OVERRIDE
Definition: pvIntrospect.h:516
int64_t int64
Definition: pvType.h:87
const Union & const_reference
Definition: pvIntrospect.h:894
UnionConstPtr getUnion() const
Definition: pvIntrospect.h:662
std::vector< std::string > StringArray
Definition: pvType.h:110
static const std::string ANY_ID
Definition: pvIntrospect.h:884
std::tr1::shared_ptr< FieldCreate > FieldCreatePtr
const StructureArray & const_reference
Definition: pvIntrospect.h:611
This class implements introspection object for bounded scalar array.
Definition: pvIntrospect.h:543
long & indent_value(std::ios_base &ios)
Definition: printer.cpp:30
std::tr1::shared_ptr< const FT > getFieldT(std::string const &fieldName) const
Definition: pvIntrospect.h:754
const Array & const_reference
Definition: pvIntrospect.h:467
Callback class for serialization.
Definition: serialize.h:34
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
Definition: shared_ptr.hpp:808
int16_t int16
Definition: pvType.h:79
FieldConstPtrArray const & getFields() const
#define FORCE_INLINE
Definition: templateMeta.h:20
virtual std::size_t getMaximumCapacity() const OVERRIDE FINAL
Definition: pvIntrospect.h:558
std::tr1::shared_ptr< const FT > getField(std::size_t index) const
Definition: pvIntrospect.h:960
Standard Fields is a class or creating or sharing Field objects for standard fields.
Definition: standardField.h:63
epicsMutex Mutex
Definition: lock.h:28
ScalarType getScalarType() const
Definition: pvIntrospect.h:407
bool isUInteger(ScalarType type)
Definition: TypeFunc.cpp:48
bool isVariant() const
BoundedScalarArray & reference
Definition: pvIntrospect.h:546
#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
Definition: pvIntrospect.h:952
static const FieldCreatePtr & getFieldCreate()
virtual ArraySizeType getArraySizeType() const OVERRIDE FINAL
Definition: pvIntrospect.h:588
int32_t int32
Definition: pvType.h:83
static const std::string DEFAULT_ID
Definition: pvIntrospect.h:704
uint8_t uint8
Definition: pvType.h:91
virtual ArraySizeType getArraySizeType() const OVERRIDE
Definition: pvIntrospect.h:514
#define OP(ENUM, TYPE)
StringArray const & getFieldNames() const
Definition: pvIntrospect.h:828
uint32_t uint32
Definition: pvType.h:99
std::tr1::shared_ptr< const UnionArray > UnionArrayConstPtr
Definition: pvIntrospect.h:174
#define FINAL
Definition: pvIntrospect.h:51