9 Commits
7.1.0 ... 7.1.1

Author SHA1 Message Date
Michael Davidsaver
12d851dc6f release notes for 7.1.1 2019-03-18 09:08:08 -07:00
Michael Davidsaver
643f289c23 missing include 2019-03-11 14:55:55 -07:00
Michael Davidsaver
68e74ed1d2 update release notes 2019-03-11 14:08:01 -07:00
Michael Davidsaver
f0ef0965c4 AnyScalar doc 2019-03-11 14:05:10 -07:00
Michael Davidsaver
61ce532fdf cleanup test 2019-03-11 14:05:05 -07:00
Michael Davidsaver
d746e1bfb3 minor 2019-03-11 14:04:53 -07:00
MJGaughran
deccc41b9a Disabled NEED_OLL_FUNCS for Visual Studio 2013+ (#64)
* Disabled NEED_OLL_FUNCS for Visual Studio 2013+

Both _MSC_VER (VC++ compiler version) and EPICS base version should be
checked for strtoll, strtoull definitions.

* NEED_OLL_FUNCS now defined only for VS builds
2019-03-02 11:11:42 -08:00
Michael Davidsaver
2814c779bd StandardField::getStandardField safety 2019-01-15 21:01:38 -08:00
Michael Davidsaver
4c73607799 cleanup StandardField 2019-01-15 21:01:38 -08:00
7 changed files with 143 additions and 533 deletions

View File

@@ -2,8 +2,15 @@
@page release_notes Release Notes @page release_notes Release Notes
Release 7.1.1 (Mar 2019)
========================
- Fixes
- Init order issue with StandardField::getStandardField()
- Build fix for Visual Studio 2013+
Release 7.1.0 (Nov 2018) Release 7.1.0 (Nov 2018)
========================== ========================
- Deprecations - Deprecations
- BoundedString, BoundedScalarArray, and FixedScalarArray will be removed unless they are fixed. - BoundedString, BoundedScalarArray, and FixedScalarArray will be removed unless they are fixed.

View File

@@ -33,8 +33,6 @@ using std::string;
namespace epics { namespace pvData { namespace epics { namespace pvData {
static DebugLevel debugLevel = lowDebug;
size_t Field::num_instances; size_t Field::num_instances;
@@ -405,9 +403,7 @@ StructureArray::StructureArray(StructureConstPtr const & structure)
{ {
} }
StructureArray::~StructureArray() { StructureArray::~StructureArray() {}
if(debugLevel==highDebug) printf("~StructureArray\n");
}
string StructureArray::getID() const string StructureArray::getID() const
{ {
@@ -444,9 +440,7 @@ UnionArray::UnionArray(UnionConstPtr const & _punion)
{ {
} }
UnionArray::~UnionArray() { UnionArray::~UnionArray() {}
if(debugLevel==highDebug) printf("~UnionArray\n");
}
string UnionArray::getID() const string UnionArray::getID() const
{ {

View File

@@ -11,6 +11,7 @@
#include <stdexcept> #include <stdexcept>
#include <epicsMutex.h> #include <epicsMutex.h>
#include <epicsThread.h>
#define epicsExportSharedSymbols #define epicsExportSharedSymbols
#include <pv/lock.h> #include <pv/lock.h>
@@ -22,32 +23,85 @@ using std::string;
namespace epics { namespace pvData { namespace epics { namespace pvData {
static
StructureConstPtr buildValueAlarm(ScalarType vtype)
{
return FieldBuilder::begin()
->setId("valueAlarm_t")
->add("active", pvBoolean)
->add("lowAlarmLimit", vtype)
->add("lowWarningLimit", vtype)
->add("highWarningLimit", vtype)
->add("highAlarmLimit", vtype)
->add("lowAlarmSeverity", pvInt)
->add("lowWarningSeverity", pvInt)
->add("highWarningSeverity", pvInt)
->add("highAlarmSeverity", pvInt)
->add("hysteresis", pvByte)
->createStructure();
}
StandardField::StandardField() StandardField::StandardField()
: fieldCreate(getFieldCreate()), :fieldCreate(getFieldCreate())
notImplemented("not implemented"), ,notImplemented("not implemented")
valueFieldName("value") ,valueFieldName("value")
{}
void StandardField::init() ,alarmField(FieldBuilder::begin()
{ ->setId("alarm_t")
createAlarm(); ->add("severity", pvInt)
createTimeStamp(); ->add("status", pvInt)
createDisplay(); ->add("message", pvString)
createControl(); ->createStructure())
createBooleanAlarm();
createByteAlarm(); ,timeStampField(FieldBuilder::begin()
createShortAlarm(); ->setId("time_t")
createIntAlarm(); ->add("secondsPastEpoch", pvLong)
createLongAlarm(); ->add("nanoseconds", pvInt)
createUByteAlarm(); ->add("userTag", pvInt)
createUShortAlarm(); ->createStructure())
createUIntAlarm();
createULongAlarm(); ,displayField(FieldBuilder::begin()
createFloatAlarm(); ->setId("display_t")
createDoubleAlarm(); ->add("limitLow", pvDouble)
createEnumeratedAlarm(); ->add("limitHigh", pvDouble)
} ->add("description", pvString)
->add("format", pvString)
->add("units", pvString)
->createStructure())
,controlField(FieldBuilder::begin()
->setId("control_t")
->add("limitLow", pvDouble)
->add("limitHigh", pvDouble)
->add("minStep", pvDouble)
->createStructure())
,booleanAlarmField(FieldBuilder::begin()
->setId("valueAlarm_t")
->add("active", pvBoolean)
->add("falseSeverity", pvInt)
->add("trueSeverity", pvInt)
->add("changeStateSeverity", pvInt)
->createStructure())
,byteAlarmField(buildValueAlarm(pvByte))
,shortAlarmField(buildValueAlarm(pvShort))
,intAlarmField(buildValueAlarm(pvInt))
,longAlarmField(buildValueAlarm(pvLong))
,ubyteAlarmField(buildValueAlarm(pvUByte))
,ushortAlarmField(buildValueAlarm(pvUShort))
,uintAlarmField(buildValueAlarm(pvUInt))
,ulongAlarmField(buildValueAlarm(pvULong))
,floatAlarmField(buildValueAlarm(pvFloat))
,doubleAlarmField(buildValueAlarm(pvDouble))
,enumeratedAlarmField(FieldBuilder::begin()
->setId("valueAlarm_t")
->add("active", pvBoolean)
->add("stateSeverity", pvInt)
->add("changeStateSeverity", pvInt)
->createStructure())
{}
StandardField::~StandardField(){} StandardField::~StandardField(){}
@@ -145,361 +199,6 @@ StructureConstPtr StandardField::createProperties(string id,FieldConstPtr field,
return fieldCreate->createStructure(id,names,fields); return fieldCreate->createStructure(id,names,fields);
} }
void StandardField::createAlarm() {
size_t num = 3;
FieldConstPtrArray fields(num);
StringArray names(num);
names[0] = "severity";
names[1] = "status";
names[2] = "message";
fields[0] = fieldCreate->createScalar(pvInt);
fields[1] = fieldCreate->createScalar(pvInt);
fields[2] = fieldCreate->createScalar(pvString);
alarmField = fieldCreate->createStructure("alarm_t",names,fields);
}
void StandardField::createTimeStamp() {
size_t num = 3;
FieldConstPtrArray fields(num);
StringArray names(num);
names[0] = "secondsPastEpoch";
names[1] = "nanoseconds";
names[2] = "userTag";
fields[0] = fieldCreate->createScalar(pvLong);
fields[1] = fieldCreate->createScalar(pvInt);
fields[2] = fieldCreate->createScalar(pvInt);
timeStampField = fieldCreate->createStructure("time_t",names,fields);
}
void StandardField::createDisplay() {
size_t num = 5;
FieldConstPtrArray fields(num);
StringArray names(num);
names[0] = "limitLow";
names[1] = "limitHigh";
names[2] = "description";
names[3] = "format";
names[4] = "units";
fields[0] = fieldCreate->createScalar(pvDouble);
fields[1] = fieldCreate->createScalar(pvDouble);
fields[2] = fieldCreate->createScalar(pvString);
fields[3] = fieldCreate->createScalar(pvString);
fields[4] = fieldCreate->createScalar(pvString);
displayField = fieldCreate->createStructure("display_t",names,fields);
}
void StandardField::createControl() {
size_t num = 3;
FieldConstPtrArray fields(num);
StringArray names(num);
names[0] = "limitLow";
names[1] = "limitHigh";
names[2] = "minStep";
fields[0] = fieldCreate->createScalar(pvDouble);
fields[1] = fieldCreate->createScalar(pvDouble);
fields[2] = fieldCreate->createScalar(pvDouble);
controlField = fieldCreate->createStructure("control_t",names,fields);
}
void StandardField::createBooleanAlarm() {
size_t numFields = 4;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "falseSeverity";
names[2] = "trueSeverity";
names[3] = "changeStateSeverity";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvInt);
fields[2] = fieldCreate->createScalar(pvInt);
fields[3] = fieldCreate->createScalar(pvInt);
booleanAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createByteAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvByte);
fields[2] = fieldCreate->createScalar(pvByte);
fields[3] = fieldCreate->createScalar(pvByte);
fields[4] = fieldCreate->createScalar(pvByte);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvByte);
byteAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createShortAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvShort);
fields[2] = fieldCreate->createScalar(pvShort);
fields[3] = fieldCreate->createScalar(pvShort);
fields[4] = fieldCreate->createScalar(pvShort);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvShort);
shortAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createIntAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvInt);
fields[2] = fieldCreate->createScalar(pvInt);
fields[3] = fieldCreate->createScalar(pvInt);
fields[4] = fieldCreate->createScalar(pvInt);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvInt);
intAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createLongAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvLong);
fields[2] = fieldCreate->createScalar(pvLong);
fields[3] = fieldCreate->createScalar(pvLong);
fields[4] = fieldCreate->createScalar(pvLong);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvLong);
longAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createUByteAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvUByte);
fields[2] = fieldCreate->createScalar(pvUByte);
fields[3] = fieldCreate->createScalar(pvUByte);
fields[4] = fieldCreate->createScalar(pvUByte);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvUByte);
ubyteAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createUShortAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvUShort);
fields[2] = fieldCreate->createScalar(pvUShort);
fields[3] = fieldCreate->createScalar(pvUShort);
fields[4] = fieldCreate->createScalar(pvUShort);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvUShort);
ushortAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createUIntAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvUInt);
fields[2] = fieldCreate->createScalar(pvUInt);
fields[3] = fieldCreate->createScalar(pvUInt);
fields[4] = fieldCreate->createScalar(pvUInt);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvUInt);
uintAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createULongAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvULong);
fields[2] = fieldCreate->createScalar(pvULong);
fields[3] = fieldCreate->createScalar(pvULong);
fields[4] = fieldCreate->createScalar(pvULong);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvULong);
ulongAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createFloatAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvFloat);
fields[2] = fieldCreate->createScalar(pvFloat);
fields[3] = fieldCreate->createScalar(pvFloat);
fields[4] = fieldCreate->createScalar(pvFloat);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvFloat);
floatAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createDoubleAlarm() {
size_t numFields = 10;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "lowAlarmLimit";
names[2] = "lowWarningLimit";
names[3] = "highWarningLimit";
names[4] = "highAlarmLimit";
names[5] = "lowAlarmSeverity";
names[6] = "lowWarningSeverity";
names[7] = "highWarningSeverity";
names[8] = "highAlarmSeverity";
names[9] = "hysteresis";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalar(pvDouble);
fields[2] = fieldCreate->createScalar(pvDouble);
fields[3] = fieldCreate->createScalar(pvDouble);
fields[4] = fieldCreate->createScalar(pvDouble);
fields[5] = fieldCreate->createScalar(pvInt);
fields[6] = fieldCreate->createScalar(pvInt);
fields[7] = fieldCreate->createScalar(pvInt);
fields[8] = fieldCreate->createScalar(pvInt);
fields[9] = fieldCreate->createScalar(pvDouble);
doubleAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
void StandardField::createEnumeratedAlarm() {
size_t numFields = 3;
FieldConstPtrArray fields(numFields);
StringArray names(numFields);
names[0] = "active";
names[1] = "stateSeverity";
names[2] = "changeStateSeverity";
fields[0] = fieldCreate->createScalar(pvBoolean);
fields[1] = fieldCreate->createScalarArray(pvInt);
fields[2] = fieldCreate->createScalar(pvInt);
enumeratedAlarmField = fieldCreate->createStructure("valueAlarm_t",names,fields);
}
StructureConstPtr StandardField::scalar( StructureConstPtr StandardField::scalar(
ScalarType type,string const &properties) ScalarType type,string const &properties)
{ {
@@ -564,98 +263,21 @@ StructureConstPtr StandardField::enumerated(string const &properties)
return createProperties("epics:nt/NTEnum:1.0",field,properties); return createProperties("epics:nt/NTEnum:1.0",field,properties);
} }
StructureConstPtr StandardField::alarm() static StandardFieldPtr *stdFieldGbl;
{
return alarmField;
}
StructureConstPtr StandardField::timeStamp() static epicsThreadOnceId stdFieldGblOnce = EPICS_THREAD_ONCE_INIT;
{
return timeStampField;
}
StructureConstPtr StandardField::display() void StandardField::once(void*)
{ {
return displayField; stdFieldGbl = new StandardFieldPtr;
} stdFieldGbl->reset(new StandardField);
StructureConstPtr StandardField::control()
{
return controlField;
}
StructureConstPtr StandardField::booleanAlarm()
{
return booleanAlarmField;
}
StructureConstPtr StandardField::byteAlarm()
{
return byteAlarmField;
}
StructureConstPtr StandardField::ubyteAlarm()
{
return ubyteAlarmField;
}
StructureConstPtr StandardField::shortAlarm()
{
return shortAlarmField;
}
StructureConstPtr StandardField::ushortAlarm()
{
return ushortAlarmField;
}
StructureConstPtr StandardField::intAlarm()
{
return intAlarmField;
}
StructureConstPtr StandardField::uintAlarm()
{
return uintAlarmField;
}
StructureConstPtr StandardField::longAlarm()
{
return longAlarmField;
}
StructureConstPtr StandardField::ulongAlarm()
{
return ulongAlarmField;
}
StructureConstPtr StandardField::floatAlarm()
{
return floatAlarmField;
}
StructureConstPtr StandardField::doubleAlarm()
{
return doubleAlarmField;
}
StructureConstPtr StandardField::enumeratedAlarm()
{
return enumeratedAlarmField;
} }
const StandardFieldPtr &StandardField::getStandardField() const StandardFieldPtr &StandardField::getStandardField()
{ {
static StandardFieldPtr standardFieldCreate; epicsThreadOnce(&stdFieldGblOnce, &StandardField::once, 0);
static Mutex mutex;
Lock xx(mutex);
if(standardFieldCreate.get()==0) return *stdFieldGbl;
{
standardFieldCreate = StandardFieldPtr(new StandardField());
standardFieldCreate->init();
}
return standardFieldCreate;
} }
}} }}

View File

@@ -254,7 +254,7 @@ epicsParseFloat(const char *str, float *to, char **units)
#endif #endif
// Sometimes we have to provide our own copy of strtoll() // Sometimes we have to provide our own copy of strtoll()
#if defined(_WIN32) && !defined(_MINGW) #if defined(_MSC_VER) && _MSC_VER < 1800
// On Windows with MSVC, Base-3.15 provides strtoll() // On Windows with MSVC, Base-3.15 provides strtoll()
# define NEED_OLL_FUNCS (EPICS_VERSION_INT < VERSION_INT(3,15,0,1)) # define NEED_OLL_FUNCS (EPICS_VERSION_INT < VERSION_INT(3,15,0,1))
#elif defined(vxWorks) #elif defined(vxWorks)

View File

@@ -180,10 +180,11 @@ public:
/** Return typed reference to wrapped value. Non-const reference allows value modification /** Return typed reference to wrapped value. Non-const reference allows value modification
* *
* @throws bad_cast when the requested type does not match the stored type
@code @code
AnyScalar v(42); AnyScalar v(42);
v.ref<uint32>() = 42; v.ref<uint32>() = 43;
assert(v.ref<uint32>() = 43); assert(v.ref<uint32>() == 43);
@endcode @endcode
*/ */
template<typename T> template<typename T>
@@ -201,9 +202,10 @@ public:
/** Return typed reference to wrapped value. Const reference does not allow modification. /** Return typed reference to wrapped value. Const reference does not allow modification.
* *
* @throws bad_cast when the requested type does not match the stored type
@code @code
AnyScalar v(42); const AnyScalar v(42);
assert(v.ref<uint32>() = 42); assert(v.ref<uint32>() == 42);
@endcode @endcode
*/ */
template<typename T> template<typename T>
@@ -219,7 +221,10 @@ public:
return reinterpret_cast<typename meta::decorate_const<TT>::type&>(_wrap.blob); return reinterpret_cast<typename meta::decorate_const<TT>::type&>(_wrap.blob);
} }
/** copy out wrapped value, with a value conversion. */ /** copy out wrapped value, with a value conversion.
*
* @throws bad_cast when empty()==true
*/
template<typename T> template<typename T>
inline inline
T as() const { T as() const {

View File

@@ -61,6 +61,7 @@ typedef std::tr1::shared_ptr<StandardField> StandardFieldPtr;
* } * }
*/ */
class epicsShareClass StandardField { class epicsShareClass StandardField {
static void once(void*);
public: public:
/** /**
* getStandardField returns the singleton. * getStandardField returns the singleton.
@@ -131,123 +132,105 @@ public:
* create an alarm structure * create an alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr alarm(); inline const StructureConstPtr& alarm() const { return alarmField; }
/** /**
* create a timeStamp structure * create a timeStamp structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr timeStamp(); inline const StructureConstPtr& timeStamp() const { return timeStampField; }
/** /**
* create a display structure * create a display structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr display(); inline const StructureConstPtr& display() const { return displayField; }
/** /**
* create a control structure * create a control structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr control(); inline const StructureConstPtr& control() const { return controlField; }
/** /**
* create a boolean alarm structure * create a boolean alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr booleanAlarm(); inline const StructureConstPtr& booleanAlarm() const { return booleanAlarmField; }
/** /**
* create a byte alarm structure * create a byte alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr byteAlarm(); inline const StructureConstPtr& byteAlarm() const { return byteAlarmField; }
/** /**
* create a unsigned byte alarm structure * create a unsigned byte alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr ubyteAlarm(); inline const StructureConstPtr& ubyteAlarm() const { return ubyteAlarmField; }
/** /**
* create a short alarm structure * create a short alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr shortAlarm(); inline const StructureConstPtr& shortAlarm() const { return shortAlarmField; }
/** /**
* create a unsigned short alarm structure * create a unsigned short alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr ushortAlarm(); inline const StructureConstPtr& ushortAlarm() const { return ushortAlarmField; }
/** /**
* create an int alarm structure * create an int alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr intAlarm(); inline const StructureConstPtr& intAlarm() const { return intAlarmField; }
/** /**
* create a unsigned int alarm structure * create a unsigned int alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr uintAlarm(); inline const StructureConstPtr& uintAlarm() const { return uintAlarmField; }
/** /**
* create a long alarm structure * create a long alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr longAlarm(); inline const StructureConstPtr& longAlarm() const { return longAlarmField; }
/** /**
* create a unsigned long alarm structure * create a unsigned long alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr ulongAlarm(); inline const StructureConstPtr& ulongAlarm() const { return ulongAlarmField; }
/** /**
* create a float alarm structure * create a float alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr floatAlarm(); inline const StructureConstPtr& floatAlarm() const { return floatAlarmField; }
/** /**
* create a double alarm structure * create a double alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr doubleAlarm(); inline const StructureConstPtr& doubleAlarm() const { return doubleAlarmField; }
/** /**
* create an enumerated alarm structure * create an enumerated alarm structure
* @return The const shared pointer to the structure. * @return The const shared pointer to the structure.
*/ */
StructureConstPtr enumeratedAlarm(); inline const StructureConstPtr& enumeratedAlarm() const { return enumeratedAlarmField; }
private: private:
StandardField(); StandardField();
void init();
StructureConstPtr createProperties( StructureConstPtr createProperties(
std::string id,FieldConstPtr field,std::string properties); std::string id,FieldConstPtr field,std::string properties);
FieldCreatePtr fieldCreate; const FieldCreatePtr fieldCreate;
std::string notImplemented; const std::string notImplemented;
std::string valueFieldName; const std::string valueFieldName;
StructureConstPtr alarmField; const StructureConstPtr alarmField;
StructureConstPtr timeStampField; const StructureConstPtr timeStampField;
StructureConstPtr displayField; const StructureConstPtr displayField;
StructureConstPtr controlField; const StructureConstPtr controlField;
StructureConstPtr booleanAlarmField; const StructureConstPtr booleanAlarmField;
StructureConstPtr byteAlarmField; const StructureConstPtr byteAlarmField;
StructureConstPtr shortAlarmField; const StructureConstPtr shortAlarmField;
StructureConstPtr intAlarmField; const StructureConstPtr intAlarmField;
StructureConstPtr longAlarmField; const StructureConstPtr longAlarmField;
StructureConstPtr ubyteAlarmField; const StructureConstPtr ubyteAlarmField;
StructureConstPtr ushortAlarmField; const StructureConstPtr ushortAlarmField;
StructureConstPtr uintAlarmField; const StructureConstPtr uintAlarmField;
StructureConstPtr ulongAlarmField; const StructureConstPtr ulongAlarmField;
StructureConstPtr floatAlarmField; const StructureConstPtr floatAlarmField;
StructureConstPtr doubleAlarmField; const StructureConstPtr doubleAlarmField;
StructureConstPtr enumeratedAlarmField; const StructureConstPtr enumeratedAlarmField;
void createAlarm();
void createTimeStamp();
void createDisplay();
void createControl();
void createBooleanAlarm();
void createByteAlarm();
void createShortAlarm();
void createIntAlarm();
void createLongAlarm();
void createUByteAlarm();
void createUShortAlarm();
void createUIntAlarm();
void createULongAlarm();
void createFloatAlarm();
void createDoubleAlarm();
void createEnumeratedAlarm();
//friend StandardFieldPtr getStandardField();
}; };
FORCE_INLINE const StandardFieldPtr& getStandardField() { FORCE_INLINE const StandardFieldPtr& getStandardField() {

View File

@@ -15,6 +15,7 @@
#include <epicsUnitTest.h> #include <epicsUnitTest.h>
#include <testMain.h> #include <testMain.h>
#include <pv/pvUnitTest.h>
#include <pv/pvIntrospect.h> #include <pv/pvIntrospect.h>
#include <pv/pvData.h> #include <pv/pvData.h>
#include <pv/convert.h> #include <pv/convert.h>
@@ -29,9 +30,7 @@ static StandardFieldPtr standardField = getStandardField();
static void print(const string& name, FieldConstPtr const & f) static void print(const string& name, FieldConstPtr const & f)
{ {
std::ostringstream strm; testShow()<<name<<'\n'<<format::indent_level(1)<<f;
strm << std::endl << name << std::endl << f << std::endl;
testDiag("%s", strm.str().c_str());
} }
MAIN(testStandardField) MAIN(testStandardField)