document new PVStructure::getAs method

This commit is contained in:
Marty Kraimer
2015-06-23 08:24:54 -04:00
parent 1e646f8df1
commit c521f9299d
4 changed files with 5522 additions and 17 deletions

View File

@@ -1,10 +1,26 @@
<h1>Release 4.1 IN DEVELOPMENT</h1>
<p>The main changes since release 4.0 are:</p>
<ul>
<li>Convert copy methods and equals operators (re)moved</li>
<li>Convert::copyUnion now always copies between subfields.</li>
<li>CreateRequest prevents a possible SEGFAULT.</li>
<li>New stream operators for Field and PVField are provided.</li>
<li>New method getAs that is like getSubField except that it throws exception</li>
</ul>
<h2>Convert copy methods and equals operators</h2>
<p>Convert copy methods where moved and replaced with methods
on PVField classes, i.e.</p>
<pre><code>PVField::copy(const PVField&amp; from)
</code></pre>
<p>Methods</p>
<pre><code>PVField::copyUnchecked(const PVField&amp; from)
</code></pre>
<p>where added to allow unchecked copies, to gain performance
where checked are not needed (anymore).</p>
<p>In addition:
- isCompatibleXXX methods were removed in favour of Field::operator==.
- equals methods were remove in favour of PVField::operator==.
- operator== methods where moved to pvIntrospect.h and pvData.h</p>
<h2>Convert::copyUnion</h2>
<p>Before this method, depending on types for to and from,
sometimes did a shallow cppy, i. e. just made to shared_ptr for to
@@ -39,6 +55,10 @@ it was necessary to have code like:</p>
cout &lt;&lt; pv &lt;&lt; endl;
}
</code></pre>
<h2>New method getAs that is like getSubField except that it throws exception</h2>
<p><b>PVStructure</b> has a new template member <b>getAs(const char *name)</b>
that is like <b>getSubField</b> except that it throws a runtime_error
instead of returning null.</p>
<h1>Release 4.0</h1>
<p>The main changes since release 3.0.2 are:</p>
<ul>

View File

@@ -7,6 +7,7 @@ The main changes since release 4.0 are:
* Convert::copyUnion now always copies between subfields.
* CreateRequest prevents a possible SEGFAULT.
* New stream operators for Field and PVField are provided.
* New method getAs that is like getSubField except that it throws exception
Convert copy methods and equals operators
-----------------------------------------
@@ -72,6 +73,12 @@ Now it can be done as follows:
cout << pv << endl;
}
New method getAs that is like getSubField except that it throws exception
--------------------
<b>PVStructure</b> has a new template member <b>getAs(const char *name)</b>
that is like <b>getSubField</b> except that it throws a runtime_error
instead of returning null.
Release 4.0
===========

View File

@@ -37,7 +37,7 @@
<h1>EPICS pvDataCPP</h1>
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
<h2 class="nocount">EPICS v4 Working Group, Working Draft, 10-Nov-2014</h2>
<h2 class="nocount">EPICS v4 Working Group, Working Draft, 23-June-2015</h2>
<dl>
<dt>Latest version:</dt>
@@ -46,11 +46,11 @@
</dd>
<dt>This version:</dt>
<dd><a
href="pvDataCPP_20141110.html">pvDataCPP_20141110.html</a>
href="pvDataCPP_20150623.html">pvDataCPP_20150623.html</a>
</dd>
<dt>Previous version:</dt>
<dd><a
href="pvDataCPP_20140723.html">pvDataCPP_20140723.html</a>
href="pvDataCPP_20141110.html">pvDataCPP_20141110.html</a>
</dd>
<dt>Editors:</dt>
<dd>Marty Kraimer, BNL</dd>
@@ -79,7 +79,7 @@ V4 control system programming environment:<br />
<h2 class="nocount">Status of this Document</h2>
<p>This is the 10-Nov-2014 version of the C++ implementation of pvData.
<p>This is the 23-June-2015 version of the C++ implementation of pvData.
</p>
<p>RELEASE_NOTES.md provides changes since the last release.
@@ -465,10 +465,10 @@ structure
PVStructurePtr doubleValue = getPVDataCreate()-&gt;createPVStructure(
getStandardField()-&gt;scalar(pvDouble,"alarm,timeStamp"));
PVDoublePtr pvdouble =
doubleValue-&gt;getSubField&lt;PVDouble&gt;("value");
doubleValue-&gt;getAs&lt;PVDouble&gt;("value");
pvdouble-&gt;put(1e5);
cout &lt;&lt; *doubleValue &lt;&lt; endl;
double value = doubleValue-&gt;getSubField&lt;PVDouble&gt;("value")-&gt;get();
double value = doubleValue-&gt;getAs&lt;PVDouble&gt;("value")-&gt;get();
cout &lt;&lt; "from get " &lt;&lt; value &lt;&lt; "\n\n";
</pre>
This produces:
@@ -491,7 +491,7 @@ from get 100000
PVStructurePtr doubleArrayValue = pvDataCreate-&gt;createPVStructure(
standardField-&gt;scalarArray(pvDouble,"alarm,timeStamp"));
PVDoubleArrayPtr pvDoubleArray =
doubleArrayValue-&gt;getSubField&lt;PVDoubleArray&gt;("value");
doubleArrayValue-&gt;getAs&lt;PVDoubleArray&gt;("value");
size_t len = 10;
shared_vector&lt;double&gt; xxx(len);
for(size_t i=0; i&lt; len; ++i) xxx[i] = i;
@@ -605,10 +605,10 @@ structure
createUnion(),
"alarm,timeStamp"));
PVStructurePtr pvTimeStamp =
pvStructure-&gt;getSubField&lt;PVUnion&gt;("value")-&gt;select&lt;PVStructure&gt;(2);
pvTimeStamp-&gt;getSubField&lt;PVLong&gt;("secondsPastEpoch")-&gt;put(1000);
pvStructure-&gt;getAs&lt;PVUnion&gt;("value")-&gt;select&lt;PVStructure&gt;(2);
pvTimeStamp-&gt;getAs&lt;PVLong&gt;("secondsPastEpoch")-&gt;put(1000);
cout &lt;&lt; *pvStructure) &lt;&lt; "\n";
pvStructure-&gt;getSubField&lt;PVUnion&gt;("value")-&gt;select&lt;PVDouble&gt;(0)-&gt;put(1e5);
pvStructure-&gt;getAs&lt;PVUnion&gt;("value")-&gt;select&lt;PVDouble&gt;(0)-&gt;put(1e5);
cout &lt;&lt; *pvStructure &lt;&lt; "\n\n";
</pre>
This produces:
@@ -648,13 +648,13 @@ epics:nt/NTUnion:1.0
standardField-&gt;variantUnion("alarm,timeStamp"));
PVStructurePtr pvTimeStamp =
pvDataCreate-&gt;createPVStructure(standardField-&gt;timeStamp());
pvStructure-&gt;getSubField&lt;PVUnion&gt;("value")-&gt;set(pvTimeStamp);
pvTimeStamp-&gt;getSubField&lt;PVLong&gt;("secondsPastEpoch")-&gt;put(1000);
pvStructure-&gt;getAs&lt;PVUnion&gt;("value")-&gt;set(pvTimeStamp);
pvTimeStamp-&gt;getAs&lt;PVLong&gt;("secondsPastEpoch")-&gt;put(1000);
cout &lt;&lt; *pvStructure &lt;&lt; "\n";
pvStructure-&gt;getSubField&lt;PVUnion&gt;("value")-&gt;set(
pvStructure-&gt;getAs&lt;PVUnion&gt;("value")-&gt;set(
pvDataCreate-&gt;createPVScalar(pvDouble));
PVDoublePtr pvValue = static_pointer_cast&lt;PVDouble&gt;(
pvStructure-&gt;getSubField&lt;PVUnion&gt;("value")-&gt;get());
pvStructure-&gt;getAs&lt;PVUnion&gt;("value")-&gt;get());
pvValue-&gt;put(1e5);
cout &lt;&lt; *pvStructure &lt;&lt; "\n\n";
</pre>
@@ -718,7 +718,7 @@ epics:nt/NTUnion:1.0
cout &lt;&lt; *pvStructure-&gt;getStructure() &lt;&lt; endl;
cout &lt;&lt; "data\n";
cout &lt;&lt; *pvStructure &lt;&lt; "\n";
PVUnionPtr pvUnion = pvStructure-&gt;getSubField&lt;PVUnion&gt;("value");;
PVUnionPtr pvUnion = pvStructure-&gt;getAs&lt;PVUnion&gt;("value");;
pvUnion-&gt;select("doubleValue");
PVDoublePtr pvDouble = pvUnion-&gt;get&lt;PVDouble&gt;();
pvDouble-&gt;put(1.55);
@@ -726,7 +726,7 @@ epics:nt/NTUnion:1.0
cout &lt;&lt; *pvStructure &lt;&lt; "\n";
cout &lt;&lt; "value = " &lt;&lt; pvDouble-&gt;get() &lt;&lt; "\n";
pvUnion-&gt;select("structValue");
pvDouble = pvUnion-&gt;get&lt;PVStructure&gt;()-&gt;getSubField&lt;PVDouble&gt;("doubleValue");
pvDouble = pvUnion-&gt;get&lt;PVStructure&gt;()-&gt;getAs&lt;PVDouble&gt;("doubleValue");
pvDouble-&gt;put(1.65);
cout &lt;&lt; "select structValue\n";
cout &lt;&lt; *pvStructure &lt;&lt; "\n";
@@ -2304,6 +2304,9 @@ public:
template&lt;typename PVT&gt;
std::tr1::shared_ptr&lt;PVT&gt; getSubField(std::string const &amp;fieldName) const
template&lt;typename PVT&gt;
PVT&amp; getAs(const char *name) const;
PVFieldPtr getSubField(std::size_t fieldOffset) const;
template&lt;typename PVT&gt;
@@ -2329,6 +2332,9 @@ public:
<dt>getPVFields</dt>
<dd>Returns the array of subfields. The set of subfields must all have
different field names.</dd>
<dt>getAs(const char *name)</dt>
<dd>Like the getSubField except that it throws std::runtime_error if
the field does not exists or has the wrong type.</dd>
<dt>getSubField(std::string fieldName)</dt>
<dd>
Get a subField of a field.d
@@ -5408,7 +5414,7 @@ public:
raiseMonitor = true;
if(pvFieldOptions!=NULL) {
PVStringPtr pvString =
pvFieldOptions-&gt;getSubField&lt;PVString&gt;("raiseMonitor");
pvFieldOptions-&gt;getAs&lt;PVString&gt;("raiseMonitor");
if(pvString!=NULL) {
std::string value = pvString-&gt;get();
if(value.compare("false")==0) raiseMonitor = false;

File diff suppressed because it is too large Load Diff