20#include <epicsAssert.h>
22#include <pv/pvIntrospect.h>
23#include <pv/typeCast.h>
24#include <pv/anyscalar.h>
25#include <pv/sharedVector.h>
28#include <compilerDependencies.h>
30#if defined(vxWorks) && !defined(_WRS_VXWORKS_MAJOR)
31typedef class std::ios
std::ios_base;
34namespace
epics {
namespace pvData {
54template<
typename T>
class PVScalarValue;
55template<
typename T>
class PVValueArray;
100typedef std::tr1::shared_ptr<PVStructureArray> PVStructureArrayPtr;
102typedef std::tr1::shared_ptr<PVStructureArrayPtrArray> PVStructureArrayPtrArrayPtr;
120typedef std::tr1::shared_ptr<PVUnionArray> PVUnionArrayPtr;
122typedef std::tr1::shared_ptr<PVUnionArrayPtrArray> PVUnionArrayPtrArrayPtr;
125typedef std::tr1::shared_ptr<PVDataCreate> PVDataCreatePtr;
154 public std::tr1::enable_shared_from_this<PVField>
214 inline const PVStructure * getParent()
const {
return parent;}
236 virtual std::ostream&
dumpValue(std::ostream& o)
const = 0;
239 void copyUnchecked(
const PVField& from);
241 static size_t num_instances;
244 PVField::shared_pointer getPtrSelf()
246 return shared_from_this();
248 explicit PVField(FieldConstPtr field);
249 void setParentAndName(PVStructure *parent, std::string
const & fieldName);
251 static void computeOffset(
const PVField *pvField);
252 static void computeOffset(
const PVField *pvField,std::size_t offset);
253 std::string fieldName;
255 const FieldConstPtr field;
257 size_t nextFieldOffset;
259 PostHandlerPtr postHandler;
260 friend class PVDataCreate;
261 friend class PVStructure;
262 EPICS_NOT_COPYABLE(PVField)
265epicsShareExtern std::ostream&
operator<<(std::ostream& o,
const PVField& f);
308 virtual void getAs(
void *,
ScalarType)
const = 0;
311 virtual void getAs(
AnyScalar& v)
const =0;
331 inline void putFrom(
const AnyScalar& v) {
333 putFrom(v.unsafe(), v.
type());
336 virtual void assign(
const PVScalar&) = 0;
339 virtual void copyUnchecked(
const PVScalar& from) = 0;
351 inline void store(T v) {
360 typedef const std::string& arg_type;
361 void store(
const std::string& val) {
362 if (maxLength > 0 && val.length() > maxLength)
382 typedef T value_type;
384 typedef const T* const_pointer;
396 typename storage_t::arg_type
get()
const {
return storage.value; }
401 inline void put(
typename storage_t::arg_type v) {
406 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE;
411 virtual void operator>>=(T& value)
const;
416 virtual void operator<<=(
typename storage_t::arg_type value);
418 template<
typename T1>
419 inline T1 getAs()
const {
420 T1 result(castUnsafe<T1,T>(
get()));
424 template<
typename T1>
425 inline void putFrom(
typename detail::ScalarStorageOps<T1>::arg_type val) {
426 put(castUnsafe<T,T1>(val));
429 inline void putFrom(
const AnyScalar& v) {
431 PVScalar::putFrom(v);
434 virtual void assign(
const PVScalar& scalar) OVERRIDE FINAL;
435 virtual void copy(
const PVScalar& from) OVERRIDE FINAL;
436 virtual void copyUnchecked(
const PVScalar& from) OVERRIDE FINAL;
446 virtual void getAs(
void * result,
ScalarType rtype)
const OVERRIDE FINAL
449 castUnsafeV(1, rtype, result, typeCode, (
const void*)&src);
452 virtual void getAs(AnyScalar& v)
const OVERRIDE FINAL
459 castUnsafeV(1, typeCode, (
void*)&result, stype, src);
475 return o << static_cast<int>(
get());
481 return o << static_cast<unsigned int>(
get());
487 return o << std::boolalpha << static_cast<bool>(
get());
504typedef std::tr1::shared_ptr<PVBoolean> PVBooleanPtr;
505typedef std::tr1::shared_ptr<PVByte> PVBytePtr;
506typedef std::tr1::shared_ptr<PVShort> PVShortPtr;
507typedef std::tr1::shared_ptr<PVInt> PVIntPtr;
508typedef std::tr1::shared_ptr<PVLong> PVLongPtr;
509typedef std::tr1::shared_ptr<PVUByte> PVUBytePtr;
510typedef std::tr1::shared_ptr<PVUShort> PVUShortPtr;
511typedef std::tr1::shared_ptr<PVUInt> PVUIntPtr;
512typedef std::tr1::shared_ptr<PVULong> PVULongPtr;
513typedef std::tr1::shared_ptr<PVFloat> PVFloatPtr;
514typedef std::tr1::shared_ptr<PVDouble> PVDoublePtr;
528 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE FINAL;
540typedef std::tr1::shared_ptr<PVString> PVStringPtr;
572 virtual
std::
size_t getLength() const = 0;
577 virtual
void setLength(
std::
size_t length) = 0;
582 virtual
std::
size_t getCapacity() const = 0;
587 bool isCapacityMutable() const;
592 void setCapacityMutable(
bool isMutable);
597 virtual
void setCapacity(
std::
size_t capacity) = 0;
604 void checkLength(
size_t length) const;
606 bool capacityMutable;
651 out = shared_vector_convert<const T>(temp);
691 void copyUnchecked(
const PVScalarArray& from) {
694 shared_vector<const void> temp;
695 from._getAsVoid(temp);
700 explicit PVScalarArray(ScalarArrayConstPtr
const & scalarArray);
702 friend class PVDataCreate;
703 EPICS_NOT_COPYABLE(PVScalarArray)
746 return getSubFieldImpl(a,
false);
750 FORCE_INLINE std::tr1::shared_ptr<const PVField> getSubField(A a)
const
752 return getSubFieldImpl(a,
false);
765 template<
typename PVD,
typename A>
768 STATIC_ASSERT(PVD::isPVField);
769 return std::tr1::dynamic_pointer_cast<PVD>(getSubFieldImpl(a,
false));
772 template<
typename PVD,
typename A>
773 inline std::tr1::shared_ptr<const PVD> getSubField(A a)
const
775 STATIC_ASSERT(PVD::isPVField);
776 return std::tr1::dynamic_pointer_cast<const PVD>(getSubFieldImpl(a,
false));
788 return getSubFieldImpl(a,
true);
792 FORCE_INLINE std::tr1::shared_ptr<const PVField> getSubFieldT(A a)
const
794 return getSubFieldImpl(a,
true);
798 static void throwBadFieldType(
const char *name);
799 static void throwBadFieldType(std::size_t fieldOffset);
800 static FORCE_INLINE
void throwBadFieldType(
const std::string& name) {
801 throwBadFieldType(name.c_str());
805 template<
typename PVD,
typename A>
806 inline std::tr1::shared_ptr<PVD> getSubFieldT(A a)
808 STATIC_ASSERT(PVD::isPVField);
809 std::tr1::shared_ptr<PVD> ret(std::tr1::dynamic_pointer_cast<PVD>(getSubFieldImpl(a,
true)));
811 throwBadFieldType(a);
815 template<
typename PVD,
typename A>
816 inline std::tr1::shared_ptr<const PVD> getSubFieldT(A a)
const
818 STATIC_ASSERT(PVD::isPVField);
819 std::tr1::shared_ptr<const PVD> ret(std::tr1::dynamic_pointer_cast<const PVD>(getSubFieldImpl(a,
true)));
821 throwBadFieldType(a);
867 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE FINAL;
872 void copyUnchecked(
const PVStructure& from,
const BitSet& maskBitSet,
bool inverse =
false);
901 FORCE_INLINE
Formatter& show(
const BitSet& set) { xshow = &set;
return *
this; }
903 FORCE_INLINE
Formatter& highlight(
const BitSet& set) { xhighlight = &set;
return *
this; }
905 FORCE_INLINE
Formatter& mode(mode_t m) { xmode = m;
return *
this; }
907 FORCE_INLINE
Formatter& format(format_t f) { xfmt = f;
return *
this; }
909 friend epicsShareFunc std::ostream&
operator<<(std::ostream& strm,
const Formatter& format);
917 inline PVFieldPtr getSubFieldImpl(
const std::string& name,
bool throws)
const {
918 return getSubFieldImpl(name.c_str(),
throws);
920 PVFieldPtr getSubFieldImpl(
const char *name,
bool throws)
const;
921 PVFieldPtr getSubFieldImpl(std::size_t fieldOffset,
bool throws)
const;
923 PVFieldPtrArray pvFields;
924 StructureConstPtr structurePtr;
925 std::string extendsStructureName;
926 friend class PVDataCreate;
927 EPICS_NOT_COPYABLE(PVStructure)
931std::ostream&
operator<<(std::ostream& strm,
const PVStructure::Formatter& format);
969 inline PVField::const_shared_pointer
get()
const {
return value; }
971 template<
typename PVT>
972 inline std::tr1::shared_ptr<PVT>
get() {
973 STATIC_ASSERT(PVT::isPVField);
974 return std::tr1::dynamic_pointer_cast<PVT>(
get());
977 template<
typename PVT>
978 inline std::tr1::shared_ptr<const PVT>
get()
const {
979 STATIC_ASSERT(PVT::isPVField);
980 return std::tr1::dynamic_pointer_cast<const PVT>(
get());
991 template<
typename PVT>
992 inline std::tr1::shared_ptr<PVT> select(
int32 index) {
993 STATIC_ASSERT(PVT::isPVField);
994 return std::tr1::dynamic_pointer_cast<PVT>(select(index));
1005 template<
typename PVT>
1006 inline std::tr1::shared_ptr<PVT> select(std::string
const & fieldName) {
1007 return std::tr1::dynamic_pointer_cast<PVT>(select(fieldName));
1029 set(selector, value);
1073 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE FINAL;
1076 void copyUnchecked(
const PVUnion& from);
1079 static PVDataCreatePtr pvDataCreate;
1094 template<
typename T>
1096 typedef std::tr1::shared_ptr<std::vector<T> > shared_vector;
1100 void operator()(T*){vec.reset();}
1104 template<
typename T,
class Base>
1108 typedef T value_type;
1110 typedef const T* const_pointer;
1113 typedef ::epics::pvData::shared_vector<T>
svector;
1114 typedef ::epics::pvData::shared_vector<const T>
const_svector;
1118 template<
typename A>
1159 return thaw(result);
1175class epicsShareClass PVValueArray :
public detail::PVVectorStorage<T,PVScalarArray> {
1176 typedef detail::PVVectorStorage<T,PVScalarArray> base_t;
1178 POINTER_DEFINITIONS(PVValueArray);
1179 typedef T value_type;
1181 typedef const T* const_pointer;
1184 typedef ::epics::pvData::shared_vector<T> svector;
1185 typedef ::epics::pvData::shared_vector<const T> const_svector;
1188 static const ScalarType typeCode;
1203 virtual
size_t getLength() const OVERRIDE FINAL {
return value.size();}
1204 virtual size_t getCapacity() const OVERRIDE FINAL {
return value.capacity();}
1206 virtual void setCapacity(
size_t capacity) OVERRIDE FINAL;
1207 virtual void setLength(
size_t length) OVERRIDE FINAL;
1248 typedef ::epics::pvData::shared_vector<PVStructurePtr>
svector;
1249 typedef ::epics::pvData::shared_vector<const PVStructurePtr>
const_svector;
1257 return std::tr1::static_pointer_cast<const Array>(
structureArray);
1260 virtual size_t getLength() const OVERRIDE FINAL {
return value.size();}
1261 virtual size_t getCapacity() const OVERRIDE FINAL {
return value.capacity();}
1291 bool remove(std::size_t offset,std::size_t number);
1300 checkLength(other.size());
1310 SerializableControl *pflusher, std::size_t offset, std::size_t count)
const OVERRIDE FINAL;
1312 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE FINAL;
1313 virtual std::ostream& dumpValue(std::ostream& o, std::size_t index)
const OVERRIDE FINAL;
1347 typedef ::epics::pvData::shared_vector<PVUnionPtr>
svector;
1348 typedef ::epics::pvData::shared_vector<const PVUnionPtr>
const_svector;
1356 return std::tr1::static_pointer_cast<const Array>(
unionArray);
1359 virtual size_t getLength() const OVERRIDE FINAL {
return value.size();}
1360 virtual size_t getCapacity() const OVERRIDE FINAL {
return value.capacity();}
1390 bool remove(std::size_t offset,std::size_t number);
1399 checkLength(other.size());
1409 SerializableControl *pflusher, std::size_t offset, std::size_t count)
const OVERRIDE FINAL;
1411 virtual std::ostream&
dumpValue(std::ostream& o)
const OVERRIDE FINAL;
1412 virtual std::ostream& dumpValue(std::ostream& o, std::size_t index)
const OVERRIDE FINAL;
1431typedef std::tr1::shared_ptr<PVBooleanArray> PVBooleanArrayPtr;
1434typedef std::tr1::shared_ptr<PVByteArray> PVByteArrayPtr;
1437typedef std::tr1::shared_ptr<PVShortArray> PVShortArrayPtr;
1440typedef std::tr1::shared_ptr<PVIntArray> PVIntArrayPtr;
1443typedef std::tr1::shared_ptr<PVLongArray> PVLongArrayPtr;
1446typedef std::tr1::shared_ptr<PVUByteArray> PVUByteArrayPtr;
1449typedef std::tr1::shared_ptr<PVUShortArray> PVUShortArrayPtr;
1452typedef std::tr1::shared_ptr<PVUIntArray> PVUIntArrayPtr;
1455typedef std::tr1::shared_ptr<PVULongArray> PVULongArrayPtr;
1458typedef std::tr1::shared_ptr<PVFloatArray> PVFloatArrayPtr;
1461typedef std::tr1::shared_ptr<PVDoubleArray> PVDoubleArrayPtr;
1464typedef std::tr1::shared_ptr<PVStringArray> PVStringArrayPtr;
1467struct pvfield_factory;
1475 friend struct detail::pvfield_factory;
1520 template<
typename PVT>
1523 return std::tr1::static_pointer_cast<PVT>(createPVScalar(PVT::typeCode));
1589 template<
typename PVAT>
1592 return std::tr1::static_pointer_cast<PVAT>(createPVScalarArray(PVAT::typeCode));
1610 return createPVStructureArray(fieldCreate->createStructureArray(
structure));
1628 return createPVUnionArray(fieldCreate->createUnionArray(punion));
1638 FieldCreatePtr fieldCreate;
1649 return PVDataCreate::getPVDataCreate();
1652bool epicsShareExtern
operator==(
const PVField&,
const PVField&);
1654static inline bool operator!=(
const PVField& a,
const PVField& b)
strong_ordering operator(const error_code &__lhs, const error_code &__rhs) noexcept
basic_ostream< char > ostream
constexpr _OI copy(_II __first, _II __last, _OI __result)
basic_string< char > string
bool operator!=(const multimap< _Key, _Tp, _Compare, _Alloc > &__x, const multimap< _Key, _Tp, _Compare, _Alloc > &__y)
__rvalue_stream_insertion_t< _Ostream, _Tp > operator<<(_Ostream &&__os, const _Tp &__x)
basic_ostream< _CharT, _Traits > & operator<<(basic_ostream< _CharT, _Traits > &__os, const basic_string< _CharT, _Traits, _Alloc > &__str)
constexpr const _Tp && get(const pair< _Tp, _Up > &&__p) noexcept
constexpr bool operator==(const basic_string< _CharT, _Traits, _Alloc > &__lhs, const _CharT *__rhs)
ScalarType type() const
Type code of contained value. Or (ScalarType)-1 is empty.
Class for serializing bitSets.
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
Callback class for deserialization.
PVArray is the base class for all array types.
virtual ArrayConstPtr getArray() const =0
virtual void setImmutable()
This is a singleton class for creating data instances.
PVUnionPtr createPVUnion(PVUnionPtr const &unionToClone)
PVUnionArrayPtr createPVUnionArray(UnionConstPtr const &punion)
PVStructureArrayPtr createPVStructureArray(StructureArrayConstPtr const &structureArray)
PVScalarArrayPtr createPVScalarArray(ScalarType elementType)
std::tr1::shared_ptr< PVAT > createPVScalarArray()
PVStructurePtr createPVStructure(StructureConstPtr const &structure)
std::tr1::shared_ptr< PVT > createPVScalar()
PVScalarArrayPtr createPVScalarArray(PVScalarArrayPtr const &scalarArrayToClone)
PVStructurePtr createPVStructure(PVStructurePtr const &structToClone)
PVScalarPtr createPVScalar(ScalarConstPtr const &scalar)
PVUnionArrayPtr createPVUnionArray(UnionArrayConstPtr const &unionArray)
PVStructurePtr createPVStructure(StringArray const &fieldNames, PVFieldPtrArray const &pvFields)
PVUnionPtr createPVUnion(UnionConstPtr const &punion)
PVScalarPtr createPVScalar(ScalarType scalarType)
static const PVDataCreatePtr & getPVDataCreate()
PVScalarArrayPtr createPVScalarArray(ScalarArrayConstPtr const &scalarArray)
PVFieldPtr createPVField(FieldConstPtr const &field)
PVStructureArrayPtr createPVStructureArray(StructureConstPtr const &structure)
PVScalarPtr createPVScalar(PVScalarPtr const &scalarToClone)
PVUnionPtr createPVVariantUnion()
PVUnionArrayPtr createPVVariantUnionArray()
PVFieldPtr createPVField(PVFieldPtr const &fieldToClone)
PVField is the base class for each PVData field.
PVStructure * getParent()
virtual void setImmutable()
std::size_t getFieldOffset() const
virtual bool equals(PVField &pv)
std::size_t getNextFieldOffset() const
const std::string & getFieldName() const
virtual std::ostream & dumpValue(std::ostream &o) const =0
void setPostHandler(PostHandlerPtr const &postHandler)
std::size_t getNumberFields() const
const FieldConstPtr & getField() const
std::string getFullName() const
Base class for a scalarArray.
void putFrom(const shared_vector< const T > &inp)
void getAs(shared_vector< const T > &out) const
void assign(const PVScalarArray &pv)
const ScalarArrayConstPtr getScalarArray() const
PVScalar is the base class for each scalar field.
const ScalarConstPtr getScalar() const
virtual void putFrom(const void *, ScalarType)=0
Convert and assign.
Class that holds the data for each possible scalar type.
virtual void putFrom(const void *src, ScalarType stype)
Convert and assign.
virtual std::ostream & dumpValue(std::ostream &o) const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher)
storage_t::arg_type get() const
void put(typename storage_t::arg_type v)
PVString is special case, since it implements SerializableArray.
virtual std::ostream & dumpValue(std::ostream &o) const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
Data interface for a structure,.
PVStructure(StructureConstPtr const &structure)
std::tr1::shared_ptr< PVField > getSubField(A a)
std::tr1::shared_ptr< PVField > getSubFieldT(A a)
virtual void setImmutable()
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher, BitSet *pbitSet)
PVStructure(StructureConstPtr const &structure, PVFieldPtrArray const &pvFields)
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher)
virtual std::ostream & dumpValue(std::ostream &o) const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, BitSet *pbitSet) const
std::tr1::shared_ptr< PVD > getSubField(A a)
const PVFieldPtrArray & getPVFields() const
PVUnion has a single subfield.
static const int32 UNDEFINED_INDEX
void set(std::string const &fieldName, PVFieldPtr const &value)
int32 getSelectedIndex() const
PVFieldPtr select(std::string const &fieldName)
void set(PVFieldPtr const &value)
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher)
PVFieldPtr select(int32 index)
virtual std::ostream & dumpValue(std::ostream &o) const
const UnionConstPtr & getUnion() const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
PVUnion(UnionConstPtr const &punion)
std::string getSelectedFieldName() const
void set(int32 index, PVFieldPtr const &value)
Data class for a structureArray.
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, std::size_t offset, std::size_t count) const
virtual void setLength(std::size_t length)
virtual ArrayConstPtr getArray() const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *pflusher)
virtual void replace(const const_svector &other)
virtual std::ostream & dumpValue(std::ostream &o) const
bool remove(std::size_t offset, std::size_t number)
StructureArrayConstPtr getStructureArray() const
virtual size_t getCapacity() const
virtual void swap(const_svector &other)
virtual size_t getLength() const
virtual const_svector view() const
Fetch a read-only view of the current array data.
std::size_t append(std::size_t number)
virtual void setCapacity(size_t capacity)
Data class for a unionArray.
virtual ArrayConstPtr getArray() const
std::size_t append(std::size_t number)
bool remove(std::size_t offset, std::size_t number)
virtual void deserialize(ByteBuffer *buffer, DeserializableControl *pflusher)
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher, std::size_t offset, std::size_t count) const
virtual void setLength(std::size_t length)
virtual std::ostream & dumpValue(std::ostream &o) const
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
virtual void replace(const const_svector &other)
virtual size_t getCapacity() const
virtual const_svector view() const
Fetch a read-only view of the current array data.
UnionArrayConstPtr getUnionArray() const
virtual size_t getLength() const
virtual void swap(const_svector &other)
virtual void setCapacity(size_t capacity)
template class for all extensions of PVArray.
virtual ArrayConstPtr getArray() const
virtual const_svector view() const
Fetch a read-only view of the current array data.
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher)
virtual size_t getCapacity() const
virtual void replace(const const_svector &next)
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const
virtual void swap(const_svector &other)
This class is implemented by code that calls setPostHander.
Class for serializing arrays.
Callback class for serialization.
Base class for serialization.
Common code for PV*Array.
virtual void replace(const const_svector &next)=0
virtual const_svector view() const =0
Fetch a read-only view of the current array data.
virtual void swap(const_svector &other)=0
A holder for a contiguous piece of memory.
const PVDataCreatePtr & getPVDataCreate()
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
std::tr1::shared_ptr< const Structure > StructureConstPtr
std::tr1::shared_ptr< PVField > PVFieldPtr
std::tr1::shared_ptr< PVScalar > PVScalarPtr
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
std::tr1::shared_ptr< PVUnion > PVUnionPtr
std::tr1::shared_ptr< const ScalarArray > ScalarArrayConstPtr
std::tr1::shared_ptr< PVStructure > PVStructurePtr
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< PVScalarArray > PVScalarArrayPtr
std::tr1::shared_ptr< PostHandler > PostHandlerPtr
std::tr1::shared_ptr< const Union > UnionConstPtr