Skip to content

Commit 949f930

Browse files
Merge c6d285a into c16f19c
2 parents c16f19c + c6d285a commit 949f930

File tree

2 files changed

+126
-72
lines changed

2 files changed

+126
-72
lines changed

src/factory/PVDataCreateFactory.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,28 @@ template<> const ScalarType PVDoubleArray::typeCode = pvDouble;
5858
template<> const ScalarType PVStringArray::typeCode = pvString;
5959

6060

61+
template<typename T>
62+
inline PVScalarValue<T>::PVScalarValue(ScalarConstPtr const & scalar)
63+
: PVScalar(scalar), storage()
64+
{
65+
}
66+
6167
template<typename T>
6268
PVScalarValue<T>::~PVScalarValue() {}
6369

70+
template<typename T>
71+
inline typename PVScalarValue<T>::storage_t::arg_type PVScalarValue<T>::get() const
72+
{
73+
return storage.value;
74+
}
75+
76+
template<typename T>
77+
inline void PVScalarValue<T>::put(typename PVScalarValue<T>::storage_t::arg_type v)
78+
{
79+
storage.store(v);
80+
PVField::postPut();
81+
}
82+
6483
template<typename T>
6584
std::ostream& PVScalarValue<T>::dumpValue(std::ostream& o) const
6685
{
@@ -79,6 +98,47 @@ void PVScalarValue<T>::operator<<=(typename storage_t::arg_type value)
7998
put(value);
8099
}
81100

101+
template<typename T>
102+
template<typename T1>
103+
inline T1 PVScalarValue<T>::getAs() const
104+
{
105+
T1 result(castUnsafe<T1,T>(get()));
106+
return result;
107+
}
108+
109+
template<typename T>
110+
inline void PVScalarValue<T>::getAs(AnyScalar& v) const
111+
{
112+
v = get();
113+
}
114+
115+
template<typename T>
116+
inline void PVScalarValue<T>::getAs(void * result, ScalarType rtype) const
117+
{
118+
const T src = get();
119+
castUnsafeV(1, rtype, result, typeCode, (const void*)&src);
120+
}
121+
122+
template<typename T>
123+
inline void PVScalarValue<T>::putFrom(const void *src, ScalarType stype)
124+
{
125+
T result;
126+
castUnsafeV(1, typeCode, (void*)&result, stype, src);
127+
put(result);
128+
}
129+
130+
template<typename T>
131+
template<typename T1>
132+
inline void PVScalarValue<T>::putFrom(typename detail::ScalarStorageOps<T1>::arg_type val) {
133+
put(castUnsafe<T,T1>(val));
134+
}
135+
136+
template<typename T>
137+
inline void PVScalarValue<T>::putFrom(const AnyScalar& v) {
138+
// the template form of putFrom() hides the base class AnyScalar overload
139+
PVScalar::putFrom(v);
140+
}
141+
82142
template<typename T>
83143
void PVScalarValue<T>::assign(const PVScalar& scalar)
84144
{
@@ -142,6 +202,10 @@ PVString::PVString(ScalarConstPtr const & scalar)
142202
storage.maxLength = 0;
143203
}
144204

205+
inline PVString::~PVString()
206+
{
207+
}
208+
145209
std::ostream& PVString::dumpValue(std::ostream& o) const
146210
{
147211
o<<maybeQuote(get());
@@ -257,6 +321,18 @@ std::ostream& PVValueArray<T>::dumpValue(std::ostream& o, size_t index) const
257321
return o << print_cast(this->view().at(index));
258322
}
259323

324+
template<typename T>
325+
inline size_t PVValueArray<T>::getLength() const
326+
{
327+
return value.size();
328+
}
329+
330+
template<typename T>
331+
inline size_t PVValueArray<T>::getCapacity() const
332+
{
333+
return value.capacity();
334+
}
335+
260336
template<typename T>
261337
void PVValueArray<T>::setCapacity(size_t capacity)
262338
{
@@ -285,6 +361,12 @@ void PVValueArray<T>::setLength(size_t length)
285361
value.resize(length);
286362
}
287363

364+
template<typename T>
365+
inline typename PVValueArray<T>::const_svector PVValueArray<T>::view() const
366+
{
367+
return value;
368+
}
369+
288370
template<typename T>
289371
void PVValueArray<T>::replace(const const_svector& next)
290372
{

src/pv/pvData.h

Lines changed: 44 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -375,90 +375,62 @@ struct ScalarStorageOps<std::string> {
375375
* @ingroup pvcontainer
376376
*/
377377
template<typename T>
378-
class epicsShareClass PVScalarValue : public PVScalar {
378+
class PVScalarValue : public PVScalar {
379379
typedef detail::ScalarStorageOps<T> storage_t;
380380
public:
381381
POINTER_DEFINITIONS(PVScalarValue);
382382
typedef T value_type;
383383
typedef T* pointer;
384384
typedef const T* const_pointer;
385385

386-
static const ScalarType typeCode;
386+
epicsShareClass static const ScalarType typeCode;
387387

388388
/**
389389
* Destructor
390390
*/
391-
virtual ~PVScalarValue();
391+
epicsShareClass virtual ~PVScalarValue();
392392
/**
393393
* Get the value.
394394
* @return The value.
395395
*/
396-
typename storage_t::arg_type get() const { return storage.value; }
396+
epicsShareClass typename storage_t::arg_type get() const;
397397
/**
398398
* Put a new value into the PVScalar.
399399
* @param value The value.
400400
*/
401-
inline void put(typename storage_t::arg_type v) {
402-
storage.store(v);
403-
PVField::postPut();
404-
}
401+
epicsShareClass void put(typename storage_t::arg_type v);
405402

406-
virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE;
403+
epicsShareClass virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE;
407404

408405
// get operator
409406
// double value; doubleField >>= value;
410407
// NOTE: virtual is needed for MS C++ compiler to get this operator exported
411-
virtual void operator>>=(T& value) const;
408+
epicsShareClass virtual void operator>>=(T& value) const;
412409

413410
// put operator
414411
// double value = 12.8; doubleField <<= value;
415412
// NOTE: virtual is needed for MS C++ compiler to get this operator exported
416-
virtual void operator<<=(typename storage_t::arg_type value);
417-
418-
template<typename T1>
419-
inline T1 getAs() const {
420-
T1 result(castUnsafe<T1,T>(get()));
421-
return result;
422-
}
423-
424-
template<typename T1>
425-
inline void putFrom(typename detail::ScalarStorageOps<T1>::arg_type val) {
426-
put(castUnsafe<T,T1>(val));
427-
}
413+
epicsShareClass virtual void operator<<=(typename storage_t::arg_type value);
428414

429-
inline void putFrom(const AnyScalar& v) {
430-
// the template form of putFrom() hides the base class AnyScalar overload
431-
PVScalar::putFrom(v);
432-
}
415+
template<typename T1> epicsShareClass T1 getAs() const;
416+
template<typename T1> epicsShareClass void putFrom(typename detail::ScalarStorageOps<T1>::arg_type val);
417+
epicsShareClass void putFrom(const AnyScalar& v);
433418

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;
419+
epicsShareClass virtual void assign(const PVScalar& scalar) OVERRIDE FINAL;
420+
epicsShareClass virtual void copy(const PVScalar& from) OVERRIDE FINAL;
421+
epicsShareClass virtual void copyUnchecked(const PVScalar& from) OVERRIDE FINAL;
437422

438-
virtual void serialize(ByteBuffer *pbuffer,
423+
epicsShareClass virtual void serialize(ByteBuffer *pbuffer,
439424
SerializableControl *pflusher) const OVERRIDE;
440-
virtual void deserialize(ByteBuffer *pbuffer,
425+
epicsShareClass virtual void deserialize(ByteBuffer *pbuffer,
441426
DeserializableControl *pflusher) OVERRIDE FINAL;
442427

443428
protected:
444-
explicit PVScalarValue(ScalarConstPtr const & scalar)
445-
: PVScalar(scalar), storage() {}
446-
virtual void getAs(void * result, ScalarType rtype) const OVERRIDE FINAL
447-
{
448-
const T src = get();
449-
castUnsafeV(1, rtype, result, typeCode, (const void*)&src);
450-
}
429+
epicsShareClass explicit PVScalarValue(ScalarConstPtr const & scalar);
430+
epicsShareClass virtual void getAs(void * result, ScalarType rtype) const OVERRIDE FINAL;
451431
public:
452-
virtual void getAs(AnyScalar& v) const OVERRIDE FINAL
453-
{
454-
v = get();
455-
}
456-
virtual void putFrom(const void *src, ScalarType stype) OVERRIDE FINAL
457-
{
458-
T result;
459-
castUnsafeV(1, typeCode, (void*)&result, stype, src);
460-
put(result);
461-
}
432+
epicsShareClass virtual void getAs(AnyScalar& v) const OVERRIDE FINAL;
433+
epicsShareClass virtual void putFrom(const void *src, ScalarType stype) OVERRIDE FINAL;
462434
protected:
463435

464436
friend class PVDataCreate;
@@ -518,21 +490,21 @@ typedef std::tr1::shared_ptr<PVDouble> PVDoublePtr;
518490
*
519491
* @ingroup pvcontainer
520492
*/
521-
class epicsShareClass PVString : public PVScalarValue<std::string>, SerializableArray {
493+
class PVString : public PVScalarValue<std::string>, SerializableArray {
522494
public:
523495
/**
524496
* Destructor
525497
*/
526-
virtual ~PVString() {}
498+
epicsShareClass virtual ~PVString();
527499

528-
virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE FINAL;
500+
epicsShareClass virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE FINAL;
529501

530-
virtual void serialize(ByteBuffer *pbuffer,
502+
epicsShareClass virtual void serialize(ByteBuffer *pbuffer,
531503
SerializableControl *pflusher) const OVERRIDE FINAL;
532-
virtual void serialize(ByteBuffer *pbuffer,
504+
epicsShareClass virtual void serialize(ByteBuffer *pbuffer,
533505
SerializableControl *pflusher, size_t offset, size_t count) const OVERRIDE FINAL;
534506
protected:
535-
explicit PVString(ScalarConstPtr const & scalar);
507+
epicsShareClass explicit PVString(ScalarConstPtr const & scalar);
536508

537509
friend class PVDataCreate;
538510
EPICS_NOT_COPYABLE(PVString)
@@ -1172,7 +1144,7 @@ namespace detail {
11721144
* @ingroup pvcontainer
11731145
*/
11741146
template<typename T>
1175-
class epicsShareClass PVValueArray : public detail::PVVectorStorage<T,PVScalarArray> {
1147+
class PVValueArray : public detail::PVVectorStorage<T,PVScalarArray> {
11761148
typedef detail::PVVectorStorage<T,PVScalarArray> base_t;
11771149
public:
11781150
POINTER_DEFINITIONS(PVValueArray);
@@ -1185,40 +1157,40 @@ class epicsShareClass PVValueArray : public detail::PVVectorStorage<T,PVScalarAr
11851157
typedef ::epics::pvData::shared_vector<const T> const_svector;
11861158

11871159

1188-
static const ScalarType typeCode;
1160+
epicsShareClass static const ScalarType typeCode;
11891161

11901162
/**
11911163
* Destructor
11921164
*/
1193-
virtual ~PVValueArray();
1165+
epicsShareClass virtual ~PVValueArray();
11941166

11951167
/**
11961168
* Get introspection interface.
11971169
*/
1198-
virtual ArrayConstPtr getArray() const OVERRIDE FINAL;
1170+
epicsShareClass virtual ArrayConstPtr getArray() const OVERRIDE FINAL;
11991171

1200-
virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE FINAL;
1201-
virtual std::ostream& dumpValue(std::ostream& o, size_t index) const OVERRIDE FINAL;
1172+
epicsShareClass virtual std::ostream& dumpValue(std::ostream& o) const OVERRIDE FINAL;
1173+
epicsShareClass virtual std::ostream& dumpValue(std::ostream& o, size_t index) const OVERRIDE FINAL;
12021174

1203-
virtual size_t getLength() const OVERRIDE FINAL {return value.size();}
1204-
virtual size_t getCapacity() const OVERRIDE FINAL {return value.capacity();}
1175+
epicsShareClass virtual size_t getLength() const OVERRIDE FINAL;
1176+
epicsShareClass virtual size_t getCapacity() const OVERRIDE FINAL;
12051177

1206-
virtual void setCapacity(size_t capacity) OVERRIDE FINAL;
1207-
virtual void setLength(size_t length) OVERRIDE FINAL;
1178+
epicsShareClass virtual void setCapacity(size_t capacity) OVERRIDE FINAL;
1179+
epicsShareClass virtual void setLength(size_t length) OVERRIDE FINAL;
12081180

1209-
virtual const_svector view() const OVERRIDE FINAL {return value;}
1210-
virtual void swap(const_svector &other) OVERRIDE FINAL;
1211-
virtual void replace(const const_svector& next) OVERRIDE FINAL;
1181+
epicsShareClass virtual const_svector view() const OVERRIDE FINAL;
1182+
epicsShareClass virtual void swap(const_svector &other) OVERRIDE FINAL;
1183+
epicsShareClass virtual void replace(const const_svector& next) OVERRIDE FINAL;
12121184

12131185
// from Serializable
1214-
virtual void serialize(ByteBuffer *pbuffer,SerializableControl *pflusher) const OVERRIDE FINAL;
1215-
virtual void deserialize(ByteBuffer *pbuffer,DeserializableControl *pflusher) OVERRIDE FINAL;
1216-
virtual void serialize(ByteBuffer *pbuffer,
1186+
epicsShareClass virtual void serialize(ByteBuffer *pbuffer,SerializableControl *pflusher) const OVERRIDE FINAL;
1187+
epicsShareClass virtual void deserialize(ByteBuffer *pbuffer,DeserializableControl *pflusher) OVERRIDE FINAL;
1188+
epicsShareClass virtual void serialize(ByteBuffer *pbuffer,
12171189
SerializableControl *pflusher, size_t offset, size_t count) const OVERRIDE FINAL;
12181190

12191191
protected:
1220-
virtual void _getAsVoid(epics::pvData::shared_vector<const void>& out) const OVERRIDE FINAL;
1221-
virtual void _putFromVoid(const epics::pvData::shared_vector<const void>& in) OVERRIDE FINAL;
1192+
epicsShareClass virtual void _getAsVoid(epics::pvData::shared_vector<const void>& out) const OVERRIDE FINAL;
1193+
epicsShareClass virtual void _putFromVoid(const epics::pvData::shared_vector<const void>& in) OVERRIDE FINAL;
12221194

12231195
explicit PVValueArray(ScalarArrayConstPtr const & scalar);
12241196
const_svector value;

0 commit comments

Comments
 (0)