10 #define epicsExportSharedSymbols 17 namespace epics {
namespace nt {
24 NTURIBuilder::shared_pointer NTURIBuilder::addQueryString(std::string
const & name)
26 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
27 throw std::runtime_error(
"duplicate query field name");
29 queryFieldNames.push_back(name);
30 queryTypes.push_back(pvString);
32 return shared_from_this();
35 NTURIBuilder::shared_pointer NTURIBuilder::addQueryDouble(std::string
const & name)
37 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
38 throw std::runtime_error(
"duplicate query field name");
40 queryFieldNames.push_back(name);
41 queryTypes.push_back(pvDouble);
43 return shared_from_this();
46 NTURIBuilder::shared_pointer NTURIBuilder::addQueryInt(std::string
const & name)
48 if (std::find(queryFieldNames.begin(), queryFieldNames.end(), name) != queryFieldNames.end())
49 throw std::runtime_error(
"duplicate query field name");
51 queryFieldNames.push_back(name);
52 queryTypes.push_back(pvInt);
54 return shared_from_this();
57 StructureConstPtr NTURIBuilder::createStructure()
59 FieldBuilderPtr builder = getFieldCreate()->
60 createFieldBuilder()->
62 add(
"scheme", pvString);
65 builder->add(
"authority", pvString);
67 builder->add(
"path", pvString);
69 if (!queryFieldNames.empty())
71 FieldBuilderPtr nestedBuilder = builder->
72 addNestedStructure(
"query");
74 vector<string>::size_type len = queryFieldNames.size();
75 for (vector<string>::size_type i = 0; i < len; i++)
76 nestedBuilder->add(queryFieldNames[i], queryTypes[i]);
78 builder = nestedBuilder->endNested();
81 size_t extraCount = extraFieldNames.size();
82 for (
size_t i = 0; i< extraCount; i++)
83 builder->add(extraFieldNames[i], extraFields[i]);
85 StructureConstPtr s = builder->createStructure();
91 NTURIBuilder::shared_pointer NTURIBuilder::addAuthority()
94 return shared_from_this();
97 PVStructurePtr NTURIBuilder::createPVStructure()
99 return getPVDataCreate()->createPVStructure(createStructure());
107 NTURIBuilder::NTURIBuilder()
112 void NTURIBuilder::reset()
114 queryFieldNames.clear();
119 NTURIBuilder::shared_pointer NTURIBuilder::add(
string const & name, FieldConstPtr
const & field)
121 extraFields.push_back(field);
122 extraFieldNames.push_back(name);
123 return shared_from_this();
128 const std::string NTURI::URI(
"epics:nt/NTURI:1.0");
130 NTURI::shared_pointer NTURI::wrap(PVStructurePtr
const & pvStructure)
132 if(!isCompatible(pvStructure))
return shared_pointer();
133 return wrapUnsafe(pvStructure);
136 NTURI::shared_pointer NTURI::wrapUnsafe(PVStructurePtr
const & pvStructure)
138 return shared_pointer(
new NTURI(pvStructure));
141 bool NTURI::is_a(StructureConstPtr
const & structure)
143 return NTUtils::is_a(structure->getID(), URI);
146 bool NTURI::is_a(PVStructurePtr
const & pvStructure)
148 return is_a(pvStructure->getStructure());
151 bool NTURI::isCompatible(StructureConstPtr
const & structure)
160 .has<Scalar>(
"scheme")
162 .maybeHas<Scalar>(
"authority")
165 StructureConstPtr query(structure->getField<Structure>(
"query"));
168 StringArray
const & names(query->getFieldNames());
169 StringArray::const_iterator it;
171 for (it = names.begin(); it != names.end(); ++it)
172 r.
has<ScalarArray>(*it);
177 return result.
valid();
181 bool NTURI::isCompatible(PVStructurePtr
const & pvStructure)
183 if(!pvStructure)
return false;
185 return isCompatible(pvStructure->getStructure());
188 bool NTURI::isValid()
199 PVStructurePtr NTURI::getPVStructure()
const 205 PVStringPtr NTURI::getScheme()
const 207 return pvNTURI->getSubField<PVString>(
"scheme");
210 PVStringPtr NTURI::getAuthority()
const 212 return pvNTURI->getSubField<PVString>(
"authority");
215 PVStringPtr NTURI::getPath()
const 217 return pvNTURI->getSubField<PVString>(
"path");
220 PVStructurePtr NTURI::getQuery()
const 222 return pvNTURI->getSubField<PVStructure>(
"query");
225 StringArray
const & NTURI::getQueryNames()
const 227 return pvNTURI->getSubField<PVStructure>(
"query")->getStructure()->getFieldNames();
230 PVFieldPtr NTURI::getQueryField(std::string
const & name)
const 232 return pvNTURI->getSubField(
"query." + name);
235 NTURI::NTURI(PVStructurePtr
const & pvStructure) :
Convenience Class for NTURI.
Result & maybeHas(const std::string &name)
Validation methods for NT types.
std::tr1::shared_ptr< NTField > NTFieldPtr
Interface for in-line creating of NTURI.
std::tr1::shared_ptr< NTURI > NTURIPtr
Result & has(const std::string &name)
std::tr1::shared_ptr< detail::NTURIBuilder > NTURIBuilderPtr