18 #define epicsExportSharedSymbols 31 namespace epics {
namespace pvData {
86 throw std::invalid_argument(
"destination is immutable");
87 copyUnchecked(scalar);
102 from.
getAs((
void*)&result, typeCode);
110 pbuffer->
put(storage.value);
116 SerializeHelper::serializeString(storage.value, pbuffer, pflusher);
124 storage.value = pbuffer->GET(T);
131 storage.value = SerializeHelper::deserializeString(pbuffer, pflusher);
139 if (boundedString.get())
166 if (offset > length) offset = length;
169 const size_t maxCount = length - offset;
170 if (count > maxCount)
182 size_t size = getArray()->getMaximumCapacity();
184 throw std::invalid_argument(
"invalid length for a fixed size array");
186 throw std::invalid_argument(
"new array capacity too large for a bounded size array");
199 ,structureArray(structureArray)
205 ,unionArray(unionArray)
225 o << print_cast(*it++);
227 o <<
',' << print_cast(*it);
236 return o <<
'"' <<
escape(this->
view().at(index)) <<
'"';
247 o <<
'"' <<
escape(*it++) <<
'"';
249 o <<
", \"" <<
escape(*it) <<
'"';
258 return o << print_cast(this->
view().at(index));
266 value.reserve(capacity);
278 if (length ==
value.size())
283 if (length <
value.size())
284 value.slice(0, length);
286 value.resize(length);
321 this->
getArray()->getMaximumCapacity() :
327 T* cur = nextvalue.
data();
340 size_t remaining = size;
345 const size_t available = have_bytes/
sizeof(T);
353 const size_t n2read =
std::min(remaining, available);
359 value = freeze(nextvalue);
371 temp.
slice(offset, count);
377 else if (count != array->getMaximumCapacity())
378 throw std::length_error(
"fixed array cannot be partially serialized");
380 const T* cur = temp.
data();
385 if (pflusher->
directSerialize(pbuffer, (
const char*)cur, count,
sizeof(T)))
390 const size_t space_for = empty/
sizeof(T);
399 const size_t n2send =
std::min(count, space_for);
414 this->
getArray()->getMaximumCapacity() :
420 if(size > nextvalue.
size() || !nextvalue.
unique())
422 else if(size < nextvalue.
size())
423 nextvalue.
slice(0, size);
426 string * pvalue = nextvalue.
data();
427 for(
size_t i = 0;
i<size;
i++) {
431 value = freeze(nextvalue);
441 temp.
slice(offset, count);
447 const string * pvalue = temp.
data();
448 for(
size_t i = 0;
i<temp.
size();
i++) {
456 out = static_shared_vector_cast<
const void>(this->
view());
462 this->
replace(shared_vector_convert<const T>(in));
467 PVDataCreate::PVDataCreate()
473 switch(field->getType()) {
476 return createPVScalar(xx);
480 return createPVScalarArray(xx);
484 return createPVStructure(xx);
488 return createPVStructureArray(xx);
492 return createPVUnion(xx);
496 return createPVUnionArray(xx);
499 throw std::logic_error(
"PVDataCreate::createPVField should never get here");
504 switch(fieldToClone->getField()->getType()) {
508 return createPVScalar(pvScalar);
514 return createPVScalarArray(pvScalarArray);
522 return createPVStructure(fieldNames,pvFieldPtrArray);
531 to->copyUnchecked(*from);
538 return createPVUnion(pvUnion);
546 to->copyUnchecked(*from);
550 throw std::logic_error(
"PVDataCreate::createPVField should never get here");
555 ScalarType scalarType = scalar->getScalarType();
582 throw std::logic_error(
"PVDataCreate::createPVScalar should never get here");
588 return createPVScalar(scalar);
594 ScalarType scalarType = scalarToClone->getScalar()->getScalarType();
596 pvScalar->copyUnchecked(*scalarToClone);
603 switch(scalarArray->getElementType()) {
629 throw std::logic_error(
"PVDataCreate::createPVScalarArray should never get here");
637 return createPVScalarArray(scalarArray);
644 arrayToClone->getScalarArray()->getElementType());
645 pvArray->assign(*arrayToClone.get());
686 size_t num = fieldNames.size();
688 for (
size_t i=0;
i<num;
i++) fields[
i] = pvFields[
i]->
getField();
706 pvStructure->copyUnchecked(*structToClone);
714 punion->set(unionToClone->getSelectedIndex(), createPVField(unionToClone->get()));
730 static void pvfield_factory_init(
void*)
734 }
catch(std::exception& e){
735 std::cerr<<
"Error initializing getFieldCreate() : "<<e.what()<<
"\n";
743 throw std::logic_error(
"getPVDataCreate() not initialized");
779 if(ptr)
return o << *ptr;
780 return o <<
"nullptr";
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const OVERRIDE FINAL
PVScalarValue< int32 > PVInt
PVDataCreatePtr pvDataCreate
epics::pvData::BitSetPtr empty
This class implements introspection object for Scalar.
void resize(size_t i)
Grow or shrink array.
virtual const_svector view() const OVERRIDE FINAL
Fetch a read-only view of the current array data.
PVScalar is the base class for each scalar field.
virtual void _getAsVoid(epics::pvData::shared_vector< const void > &out) const OVERRIDE FINAL
PVUnionArrayPtr createPVVariantUnionArray()
This class implements introspection object for a union.
Data class for a unionArray.
std::tr1::shared_ptr< detail::SharedPut > put
virtual bool directSerialize(ByteBuffer *existingBuffer, const char *toSerialize, std::size_t elementCount, std::size_t elementSize)=0
PVValueArray< int16 > PVShortArray
pointer data() const
Return Base pointer.
#define THROW_EXCEPTION2(TYPE, MSG)
static std::string deserializeString(ByteBuffer *buffer, DeserializableControl *control)
virtual void setLength(size_t length) OVERRIDE FINAL
PVValueArray< uint8 > PVUByteArray
virtual void deserialize(ByteBuffer *pbuffer, DeserializableControl *pflusher) OVERRIDE FINAL
PVValueArray< uint16 > PVUShortArray
virtual void setCapacity(size_t capacity) OVERRIDE FINAL
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const OVERRIDE
virtual void serialize(ByteBuffer *pbuffer, SerializableControl *pflusher) const OVERRIDE FINAL
const FieldConstPtr & getField() const
shared_ptr< T > static_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
std::tr1::shared_ptr< const Array > ArrayConstPtr
void checkLength(size_t length) const
virtual void copy(const PVScalar &from) OVERRIDE FINAL
PVValueArray< double > PVDoubleArray
pvd::StructureConstPtr type
TODO only here because of the Lockable.
std::tr1::shared_ptr< const Structure > StructureConstPtr
static size_t num_instances
std::tr1::shared_ptr< const StructureArray > StructureArrayConstPtr
static void writeSize(std::size_t s, ByteBuffer *buffer, SerializableControl *flusher)
PVValueArray< PVStructurePtr > PVStructureArray
static std::size_t readSize(ByteBuffer *buffer, DeserializableControl *control)
PVValueArray< int32 > PVIntArray
Callback class for deserialization.
This is a singleton class for creating data instances.
PVField is the base class for each PVData field.
PVScalarValue< uint32 > PVUInt
PVValueArray< uint64 > PVULongArray
std::ostream & operator<<(std::ostream &o, const Field &f)
PVScalarValue< boolean > PVBoolean
PVFieldPtr createPVField(FieldConstPtr const &field)
PVValueArray(ScalarArrayConstPtr const &scalar)
std::tr1::shared_ptr< const Scalar > ScalarConstPtr
void putArray(const T *values, std::size_t count)
std::tr1::shared_ptr< PVDataCreate > PVDataCreatePtr
PVScalarValue< uint64 > PVULong
PVStructurePtr createPVStructure(StructureConstPtr const &structure)
PVUnionArrayPtr createPVUnionArray(UnionArrayConstPtr const &unionArray)
PVString is special case, since it implements SerializableArray.
virtual void replace(const const_svector &next) OVERRIDE FINAL
PVValueArray< float > PVFloatArray
std::tr1::shared_ptr< PVUnion > PVUnionPtr
virtual void operator<<=(typename storage_t::arg_type value)
#define EPICS_THREAD_ONCE_INIT
virtual void _putFromVoid(const epics::pvData::shared_vector< const void > &in) OVERRIDE FINAL
std::tr1::shared_ptr< const Union > UnionConstPtr
This class implements introspection object for a structure.
PVValueArray< int8 > PVByteArray
PVValueArray< boolean > PVBooleanArray
std::tr1::shared_ptr< PVStructureArray > PVStructureArrayPtr
void getArray(T *values, std::size_t count)
const ScalarType typeCode
template class for all extensions of PVArray.
APIs for the epicsMutex mutual exclusion semaphore.
LIBCOM_API void epicsStdCall epicsThreadOnce(epicsThreadOnceId *id, EPICSTHREADFUNC, void *arg)
virtual void flushSerializeBuffer()=0
virtual void copyUnchecked(const PVScalar &from) OVERRIDE FINAL
std::tr1::shared_ptr< PVAT > createPVScalarArray()
PVValueArray< uint32 > PVUIntArray
PVValueArray< PVUnionPtr > PVUnionArray
virtual std::ostream & dumpValue(std::ostream &o) const OVERRIDE FINAL
std::tr1::shared_ptr< const BoundedString > BoundedStringConstPtr
This class implements introspection object for Array.
PVUnionPtr createPVVariantUnion()
Base class for a scalarArray.
virtual ArrayConstPtr getArray() const OVERRIDE FINAL
This class implements a Bytebuffer that is like the java.nio.ByteBuffer.
std::tr1::shared_ptr< PVScalar > PVScalarPtr
PVScalarValue< uint8 > PVUByte
std::tr1::shared_ptr< PVUnionArray > PVUnionArrayPtr
bool unique() const
Data is not shared?
meta::decorate_const< const T >::type * const_iterator
PVUnion has a single subfield.
std::vector< FieldConstPtr > FieldConstPtrArray
virtual void swap(const_svector &other) OVERRIDE FINAL
This class implements introspection object for BoundedString.
static void serializeString(const std::string &value, ByteBuffer *buffer, SerializableControl *flusher)
This class implements introspection object for a unionArray.
std::vector< PVFieldPtr > PVFieldPtrArray
Data interface for a structure,.
std::size_t getRemaining() const
std::tr1::shared_ptr< const Field > FieldConstPtr
PVUnionPtr createPVUnion(UnionConstPtr const &punion)
size_t size() const
Number of elements visible through this vector.
static const PVDataCreatePtr & getPVDataCreate()
FORCE_INLINE const FieldCreatePtr & getFieldCreate()
void registerRefCounter(const char *name, const size_t *counter)
PVScalarValue< int64 > PVLong
std::tr1::shared_ptr< const ScalarArray > ScalarArrayConstPtr
This class implements introspection object for scalar array.
This class implements introspection object for a structureArray.
std::tr1::shared_ptr< PVStructure > PVStructurePtr
std::tr1::shared_ptr< PVT > createPVScalar()
Data class for a structureArray.
Class that holds the data for each possible scalar type.
std::vector< std::string > StringArray
std::tr1::shared_ptr< PVField > PVFieldPtr
PVValueArray< std::string > PVStringArray
bool isCapacityMutable() const
virtual std::ostream & dumpValue(std::ostream &o) const OVERRIDE FINAL
virtual void ensureBuffer(std::size_t size)=0
virtual size_t getLength() const OVERRIDE FINAL
Callback class for serialization.
shared_ptr< T > dynamic_pointer_cast(shared_ptr< U > const &r) BOOST_NOEXCEPT
const StructureConstPtr & getStructure() const
void slice(size_t offset, size_t length=(size_t)-1)
Reduce the view of this shared_vector.
PVScalarValue< int16 > PVShort
PVValueArray< int64 > PVLongArray
PVScalarValue< int8 > PVByte
virtual bool directDeserialize(ByteBuffer *existingBuffer, char *deserializeTo, std::size_t elementCount, std::size_t elementSize)=0
virtual void assign(const PVScalar &scalar) OVERRIDE FINAL
static void serializeSubstring(const std::string &value, std::size_t offset, std::size_t count, ByteBuffer *buffer, SerializableControl *flusher)
virtual void ensureData(std::size_t size)=0
C++ and C descriptions for a thread.
std::tr1::shared_ptr< PVScalarArray > PVScalarArrayPtr
virtual std::ostream & dumpValue(std::ostream &o) const OVERRIDE
EPICS_ALWAYS_INLINE bool reverse() const
PVStructureArrayPtr createPVStructureArray(StructureArrayConstPtr const &structureArray)
PVScalarValue< double > PVDouble
PVScalarValue< float > PVFloat
PVScalarValue< uint16 > PVUShort
virtual void operator>>=(T &value) const
static const ScalarType typeCode
std::tr1::shared_ptr< const UnionArray > UnionArrayConstPtr