normativeTypesCPP 6.0.2
ntunion.cpp
Go to the documentation of this file.
1/* ntunion.cpp */
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 */
6
7#include "validator.h"
8
9#define epicsExportSharedSymbols
10#include <pv/ntunion.h>
11#include <pv/ntutils.h>
12
13using namespace std;
14using namespace epics::pvData;
15
16namespace epics { namespace nt {
17
18static NTFieldPtr ntField = NTField::get();
19
20namespace detail {
21
22
23NTUnionBuilder::shared_pointer NTUnionBuilder::value(UnionConstPtr unionType)
24{
25 valueType = unionType;
26 return shared_from_this();
27}
28
30{
31 FieldBuilderPtr builder =
32 getFieldCreate()->createFieldBuilder()->
33 setId(NTUnion::URI)->
34 add("value", valueType);
35
36 if (descriptor)
37 builder->add("descriptor", pvString);
38
39 if (alarm)
40 builder->add("alarm", ntField->createAlarm());
41
42 if (timeStamp)
43 builder->add("timeStamp", ntField->createTimeStamp());
44
45 size_t extraCount = extraFieldNames.size();
46 for (size_t i = 0; i< extraCount; i++)
47 builder->add(extraFieldNames[i], extraFields[i]);
48
49
50 StructureConstPtr s = builder->createStructure();
51
52 reset();
53 return s;
54}
55
56NTUnionBuilder::shared_pointer NTUnionBuilder::addDescriptor()
57{
58 descriptor = true;
59 return shared_from_this();
60}
61
62NTUnionBuilder::shared_pointer NTUnionBuilder::addAlarm()
63{
64 alarm = true;
65 return shared_from_this();
66}
67
68NTUnionBuilder::shared_pointer NTUnionBuilder::addTimeStamp()
69{
70 timeStamp = true;
71 return shared_from_this();
72}
73
75{
76 return getPVDataCreate()->createPVStructure(createStructure());
77}
78
83
84NTUnionBuilder::NTUnionBuilder()
85{
86 reset();
87}
88
89void NTUnionBuilder::reset()
90{
91 valueType = getFieldCreate()->createVariantUnion();
92 descriptor = false;
93 alarm = false;
94 timeStamp = false;
95 extraFieldNames.clear();
96 extraFields.clear();
97}
98
99NTUnionBuilder::shared_pointer NTUnionBuilder::add(string const & name, FieldConstPtr const & field)
100{
101 extraFields.push_back(field); extraFieldNames.push_back(name);
102 return shared_from_this();
103}
104
105
106}
107
108const std::string NTUnion::URI("epics:nt/NTUnion:1.0");
109
110NTUnion::shared_pointer NTUnion::wrap(PVStructurePtr const & pvStructure)
111{
112 if(!isCompatible(pvStructure)) return shared_pointer();
113 return wrapUnsafe(pvStructure);
114}
115
116NTUnion::shared_pointer NTUnion::wrapUnsafe(PVStructurePtr const & pvStructure)
117{
118 return shared_pointer(new NTUnion(pvStructure));
119}
120
121bool NTUnion::is_a(StructureConstPtr const & structure)
122{
123 return NTUtils::is_a(structure->getID(), URI);
124}
125
126bool NTUnion::is_a(PVStructurePtr const & pvStructure)
127{
128 return is_a(pvStructure->getStructure());
129}
130
131bool NTUnion::isCompatible(StructureConstPtr const &structure)
132{
133 if (!structure)
134 return false;
135
136 Result result(structure);
137
138 return result
139 .is<Structure>()
140 .has<Union>("value")
141 .maybeHas<Scalar>("descriptor")
142 .maybeHas<&NTField::isAlarm, Structure>("alarm")
143 .maybeHas<&NTField::isTimeStamp, Structure>("timeStamp")
144 .valid();
145}
146
147bool NTUnion::isCompatible(PVStructurePtr const & pvStructure)
148{
149 if(!pvStructure) return false;
150
151 return isCompatible(pvStructure->getStructure());
152}
153
155{
156 return true;
157}
158
163
164bool NTUnion::attachTimeStamp(PVTimeStamp &pvTimeStamp) const
165{
166 PVStructurePtr ts = getTimeStamp();
167 if (ts)
168 return pvTimeStamp.attach(ts);
169 else
170 return false;
171}
172
173bool NTUnion::attachAlarm(PVAlarm &pvAlarm) const
174{
175 PVStructurePtr al = getAlarm();
176 if (al)
177 return pvAlarm.attach(al);
178 else
179 return false;
180}
181
182PVStructurePtr NTUnion::getPVStructure() const
183{
184 return pvNTUnion;
185}
186
187PVStringPtr NTUnion::getDescriptor() const
188{
189 return pvNTUnion->getSubField<PVString>("descriptor");
190}
191
192PVStructurePtr NTUnion::getTimeStamp() const
193{
194 return pvNTUnion->getSubField<PVStructure>("timeStamp");
195}
196
197PVStructurePtr NTUnion::getAlarm() const
198{
199 return pvNTUnion->getSubField<PVStructure>("alarm");
200}
201
202PVUnionPtr NTUnion::getValue() const
203{
204 return pvValue;
205}
206
207NTUnion::NTUnion(PVStructurePtr const & pvStructure) :
208 pvNTUnion(pvStructure), pvValue(pvNTUnion->getSubField<PVUnion>("value"))
209{}
210
211
212}}
static NTFieldPtr get()
Definition ntfield.cpp:18
bool isTimeStamp(epics::pvData::FieldConstPtr const &field)
Convenience Class for NTUnion.
Definition ntunion.h:127
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntunion.cpp:116
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const
Definition ntunion.cpp:164
static bool isCompatible(epics::pvData::StructureConstPtr const &structure)
epics::pvData::PVStructurePtr getPVStructure() const
Definition ntunion.cpp:182
epics::pvData::PVUnionPtr getValue() const
Definition ntunion.cpp:202
epics::pvData::PVStringPtr getDescriptor() const
Definition ntunion.cpp:187
epics::pvData::PVStructurePtr getTimeStamp() const
Definition ntunion.cpp:192
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const
Definition ntunion.cpp:173
static shared_pointer wrap(epics::pvData::PVStructurePtr const &pvStructure)
Definition ntunion.cpp:110
static bool is_a(epics::pvData::StructureConstPtr const &structure)
static const std::string URI
Definition ntunion.h:131
epics::pvData::PVStructurePtr getAlarm() const
Definition ntunion.cpp:197
static NTUnionBuilderPtr createBuilder()
Definition ntunion.cpp:159
static bool is_a(const std::string &u1, const std::string &u2)
Definition ntutils.cpp:14
Interface for in-line creating of NTUnion.
Definition ntunion.h:39
epics::pvData::StructureConstPtr createStructure()
Definition ntunion.cpp:29
shared_pointer value(epics::pvData::UnionConstPtr unionType)
Definition ntunion.cpp:23
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
Definition ntunion.cpp:99
epics::pvData::PVStructurePtr createPVStructure()
Definition ntunion.cpp:74
friend class ::epics::nt::NTUnion
Definition ntunion.h:112
std::tr1::shared_ptr< NTField > NTFieldPtr
Definition ntfield.h:36
std::tr1::shared_ptr< detail::NTUnionBuilder > NTUnionBuilderPtr
Definition ntunion.h:117
std::tr1::shared_ptr< NTUnion > NTUnionPtr
Definition ntunion.h:26