3 Commits
5.2.2 ... 5.0.1

Author SHA1 Message Date
Ralph Lange
bcaac0163a jenkins: adapt doc script to new CloudBees jenkins job 2015-09-14 15:17:55 +02:00
Dave Hickin
f9d27b2d74 Merge branch 'master' into release/5.0 2015-09-05 07:38:15 +01:00
Ralph Lange
392cc7426d jenkins: update dependencies pvCommonCPP/4.1 pvDataCPP/5.0 2015-09-04 11:55:29 +02:00
85 changed files with 7175 additions and 6285 deletions

View File

@@ -1,10 +0,0 @@
#!/bin/sh
set -e -x
make -j2 $EXTRA
if [ "$TEST" != "NO" ]
then
make -j2 tapfiles
make -j2 -s test-results
fi

View File

@@ -1,107 +0,0 @@
#!/bin/sh
set -e -x
CURDIR="$PWD"
cat << EOF > $CURDIR/configure/RELEASE.local
EPICS_BASE=$HOME/.source/epics-base
EOF
install -d "$HOME/.source"
cd "$HOME/.source"
add_gh_flat() {
MODULE=$1
REPOOWNER=$2
REPONAME=$3
BRANCH=$4
MODULE_UC=$(echo $MODULE | tr 'a-z' 'A-Z')
( git clone --quiet --depth 5 --branch $BRANCH https://github.com/$REPOOWNER/$REPONAME.git $MODULE && \
cd $MODULE && git log -n1 )
cat < $CURDIR/configure/RELEASE.local > $MODULE/configure/RELEASE.local
cat << EOF >> $CURDIR/configure/RELEASE.local
${MODULE_UC}=$HOME/.source/$MODULE
EOF
}
# not recursive
git clone --quiet --depth 5 --branch "$BRBASE" https://github.com/${REPOBASE:-epics-base}/epics-base.git epics-base
(cd epics-base && git log -n1 )
add_gh_flat pvData ${REPOPVD:-epics-base} pvDataCPP ${BRPVD:-master}
if [ -e $CURDIR/configure/RELEASE.local ]
then
cat $CURDIR/configure/RELEASE.local
fi
EPICS_HOST_ARCH=`sh epics-base/startup/EpicsHostArch`
# requires wine and g++-mingw-w64-i686
if [ "$WINE" = "32" ]
then
echo "Cross mingw32"
sed -i -e '/CMPLR_PREFIX/d' epics-base/configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
cat << EOF >> epics-base/configure/os/CONFIG_SITE.linux-x86.win32-x86-mingw
CMPLR_PREFIX=i686-w64-mingw32-
EOF
cat << EOF >> epics-base/configure/CONFIG_SITE
CROSS_COMPILER_TARGET_ARCHS+=win32-x86-mingw
EOF
fi
if [ "$STATIC" = "YES" ]
then
echo "Build static libraries/executables"
cat << EOF >> epics-base/configure/CONFIG_SITE
SHARED_LIBRARIES=NO
STATIC_BUILD=YES
EOF
fi
case "$CMPLR" in
clang)
echo "Host compiler is clang"
cat << EOF >> epics-base/configure/os/CONFIG_SITE.Common.$EPICS_HOST_ARCH
GNU = NO
CMPLR_CLASS = clang
CC = clang
CCC = clang++
EOF
# hack
sed -i -e 's/CMPLR_CLASS = gcc/CMPLR_CLASS = clang/' epics-base/configure/CONFIG.gnuCommon
clang --version
;;
*)
echo "Host compiler is default"
gcc --version
;;
esac
cat <<EOF >> epics-base/configure/CONFIG_SITE
USR_CPPFLAGS += $USR_CPPFLAGS
USR_CFLAGS += $USR_CFLAGS
USR_CXXFLAGS += $USR_CXXFLAGS
EOF
# set RTEMS to eg. "4.9" or "4.10"
# requires qemu, bison, flex, texinfo, install-info
if [ -n "$RTEMS" ]
then
echo "Cross RTEMS${RTEMS} for pc386"
curl -L "https://github.com/mdavidsaver/rsb/releases/download/20171203-${RTEMS}/i386-rtems${RTEMS}-trusty-20171203-${RTEMS}.tar.bz2" \
| tar -C / -xmj
sed -i -e '/^RTEMS_VERSION/d' -e '/^RTEMS_BASE/d' epics-base/configure/os/CONFIG_SITE.Common.RTEMS
cat << EOF >> epics-base/configure/os/CONFIG_SITE.Common.RTEMS
RTEMS_VERSION=$RTEMS
RTEMS_BASE=$HOME/.rtems
EOF
cat << EOF >> epics-base/configure/CONFIG_SITE
CROSS_COMPILER_TARGET_ARCHS += RTEMS-pc386-qemu
EOF
fi
make -j2 -C epics-base $EXTRA
make -j2 -C pvData $EXTRA

23
.gitignore vendored
View File

@@ -1,14 +1,9 @@
/cfg/
/bin/
/lib/
/db/
/dbd/
/html/
/include/
/templates/
/configure/*.local
O.*/
/QtC-*
*.orig
*.log
.*.swp
bin/
include/
lib/
db/
dbd/
configure/*.local
html/
**/O.*
**/**/O.*

View File

@@ -1,31 +0,0 @@
sudo: false
dist: trusty
language: c++
compiler:
- gcc
addons:
apt:
packages:
- libreadline6-dev
- libncurses5-dev
- perl
- clang
- g++-mingw-w64-i686
- qemu-system-x86
install:
- ./.ci/travis-prepare.sh
script:
- ./.ci/travis-build.sh
env:
- BRBASE=7.0
- BRBASE=7.0 CMPLR=clang
- BRBASE=7.0 EXTRA="CMD_CXXFLAGS=-std=c++98"
- BRBASE=7.0 EXTRA="CMD_CXXFLAGS=-std=c++11"
- BRBASE=7.0 CMPLR=clang EXTRA="CMD_CXXFLAGS=-std=c++11"
- BRBASE=7.0 WINE=32 TEST=NO STATIC=YES
- BRBASE=7.0 WINE=32 TEST=NO STATIC=NO
- BRBASE=7.0 RTEMS=4.10 TEST=NO
- BRBASE=7.0 RTEMS=4.9 TEST=NO
- BRBASE=3.16
- BRBASE=3.15
- BRBASE=3.14

31
COPYRIGHT Normal file
View File

@@ -0,0 +1,31 @@
This software is in part copyrighted by the various organizations and
individuals listed below. Permission to use it is set out in the file
LICENSE that accompanies the software.
In no event shall any copyright holder be liable to any party for
direct, indirect, special, incidental, or consequential damages arising
out of the use of this software, its documentation, or any derivatives
thereof, even if they have been advised of the possibility of such
damage.
The copyright holders specifically disclaim any warranties, including,
but not limited to, the implied warranties of merchantability, fitness
for a particular purpose, and non-infringement. This software is
provided on an "as is" basis, and the copyright holders have no
obligation either collectively or individually to provide maintenance,
support, updates, enhancements, or modifications.
Copyright (c) 2006 - 2015 All rights reserved
Martin R. Kraimer
The University of Chicago, as Operator of Argonne National Laboratory.
Deutsches Elektronen-Synchroton, Member of the Helmholtz Association,
(DESY), HAMBURG, GERMANY,
BERLINER SPEICHERRING GESELLSCHAFT FUER SYNCHROTRONSTRAHLUNG M.B.H.
(BESSY), BERLIN, GERMANY.
COSYLAB (Control System Laboratory), Ljubljana, Slovenia.
Brookhaven Science Associates, as Operator of Brookhaven
National Laboratory.
Diamond Light Source Ltd., Didcot, United Kingdom.

109
LICENSE
View File

@@ -1,16 +1,14 @@
Copyright and License Terms
---------------------------
Copyright (c) 2006-2016 Martin R. Kraimer
Copyright (c) 2006-2016 UChicago Argonne LLC, as Operator of Argonne
Copyright (c) 2006-2015 Martin R. Kraimer
Copyright (c) 2006 The University of Chicago, as Operator of Argonne
National Laboratory.
Copyright (c) 2006 Deutsches Elektronen-Synchrotron,
Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
Copyright (c) 2007-2016 Control System Laboratory,
Copyright (c) 2007-2015 Control System Laboratory,
(COSYLAB) Ljubljana Slovenia
Copyright (c) 2010-2016 Brookhaven Science Associates, as Operator
of Brookhaven National Laboratory
Copyright (c) 2011-2016 Diamond Light Source Limited,
Copyright (c) 2010-2015 Brookhaven Science Associates, as Operator of Brookhaven
National Laboratory
Copyright (c) 2011-2015 Diamond Light Source Limited,
(DLS) Didcot, United Kingdom
Permission is hereby granted, free of charge, to any person
@@ -36,30 +34,81 @@ OTHER DEALINGS IN THE SOFTWARE.
________________________________________________________________________
Additional Disclaimers
----------------------
This software is in part copyrighted by the University of Chicago (UofC)
This software is copyright in part by these institutions:
In no event shall UofC be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
UofC has been advised of the possibility of such damage.
* Brookhaven Science Associates, as Operator of Brookhaven
National Laboratory, New York, USA
* Control System Laboratory, Ljubljana, Slovenia
* Deutsches Elektronen-Synchroton, Member of the Helmholtz
Association, Hamburg, Germany
* Diamond Light Source Limited, Didcot, United Kingdom
* Helmholtz-Zentrum Berlin fuer Materialien und Energie m.b.H.,
Berlin, Germany.
* UChicage Argonne LLC, as Operator of Argonne National Laboratory,
Illinois, USA
UofC specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and UofC has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
In no event shall these institutions be liable to any party for direct,
indirect, special, incidental, or consequential damages arising out of
the use of this software, its documentation, or any derivatives thereof,
even if advised of the possibility of such damage.
________________________________________________________________________
These institutions specifically disclaim any warranties, including, but
not limited to, the implied warranties of merchantability, fitness for a
particular purpose, and non-infringement. This software is provided on
an "as is" basis, and these institutions have no obligation to provide
maintenance, support, updates, enhancements, or modifications.
This software is in part copyrighted by the BERLINER SPEICHERRING
GESELLSCHAFT FUER SYNCHROTRONSTRAHLUNG M.B.H. (BESSY), BERLIN, GERMANY.
In no event shall BESSY be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
BESSY has been advised of the possibility of such damage.
BESSY specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and BESSY has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________
This software is in part copyrighted by the Deutsches Elektronen-Synchroton,
Member of the Helmholtz Association, (DESY), HAMBURG, GERMANY.
In no event shall DESY be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
DESY has been advised of the possibility of such damage.
DESY specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and DESY has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
______________________________________________________________________
This software is in part copyrighted by the Brookhaven
National Laboratory (BNL).
In no event shall BNL be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
BNL has been advised of the possibility of such damage.
BNL specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and BNL has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________
This software is in part copyrighted by Diamond Light Source Limited (DLS)
In no event shall DLS be liable to any party for direct, indirect,
special, incidental, or consequential damages arising out of the use of
this software, its documentation, or any derivatives thereof, even if
DLS has been advised of the possibility of such damage.
DLS specifically disclaims any warranties, including, but not limited
to, the implied warranties of merchantability, fitness for a particular
purpose, and non-infringement. This software is provided on an "as is"
basis, and DLS has no obligation to provide maintenance, support,
updates, enhancements, or modifications.
________________________________________________________________________

4
README Normal file
View File

@@ -0,0 +1,4 @@
Since the Normative Types specification is not yet at Public Working Draft level,
any implementation must be considered alpha. The implementations of helpers under
this repo must be considered alpha level.

View File

@@ -1,17 +0,0 @@
# normativeTypesCPP
The EPICS **Normative Types** are a set of standard high-level data types, designed to aid interoperability between EPICS PVA applications.
This normativeTypesCPP module is a part of the EPICS software toolkit that provides C++ helper classes which implement the EPICS Normative Types.
## Links
- General information about EPICS can be found at the
[EPICS Controls website](https://epics-controls.org).
- API documentation for this module can be found in its
documentation directory, in particular the file
normativeTypesCPP.html
## Building
This module is included as a submodule of a full EPICS 7 release and will be compiled during builds of that software.

View File

@@ -29,6 +29,9 @@ USR_CPPFLAGS += --coverage
USR_LDFLAGS += --coverage
endif
INSTALL_INCLUDE = $(INSTALL_LOCATION)/include/pv
USR_INCLUDES += -I $(INSTALL_LOCATION)/include
-include $(TOP)/../CONFIG_SITE.local
-include $(TOP)/configure/CONFIG_SITE.local

View File

@@ -1,40 +1,32 @@
# RELEASE - Location of external support modules
#RELEASE Location of external products
#
# IF YOU CHANGE ANY PATHS in this file or make API changes to
# any modules it refers to, you should do a "make rebuild" in
# this application's top level directory.
# IF YOU MAKE ANY CHANGES to this file you MUST at least run
# "gnumake" in this directory afterwards; you usually need
# to run "gnumake rebuild" in the application's top level
# directory each time this file is changed.
#
# The EPICS build process does not check dependencies against
# any files from outside the application, so it is safest to
# rebuild it completely if any modules it depends on change.
# NOTE: The build does not check dependencies against files
# that are outside this application, thus you should run
# "gnumake distclean install" in the top directory each time
# EPICS_BASE, SNCSEQ, or any other external module defined
# in the RELEASE file is rebuilt.
#
# Host- or target-specific settings can be given in files named
# Host/target specific settings can be specified in files named
# RELEASE.$(EPICS_HOST_ARCH).Common
# RELEASE.Common.$(T_A)
# RELEASE.$(EPICS_HOST_ARCH).$(T_A)
#
# This file is parsed by both GNUmake and an EPICS Perl script,
# so it may ONLY contain definititions of paths to other support
# modules, variable definitions that are used in module paths,
# and include statements that pull in other RELEASE files.
# Variables may be used before their values have been set.
# Build variables that are NOT used in paths should be set in
# the CONFIG_SITE file.
# Variables and paths to dependent modules:
#MODULES = /path/to/modules
#MYMODULE = $(MODULES)/my-module
TEMPLATE_TOP=$(EPICS_BASE)/templates/makeBaseApp/top
# If building the EPICS modules individually, set these:
#EPICS_PVDATA = $(MODULES)/pvData-7.0.0
#EPICS_LIBCOM = $(MODULES)/libcom-3.17.0
#EPICS_BASE = $(MODULES)/core-7.0.1
#If using the sequencer, point SNCSEQ at its top directory:
#SNCSEQ=$(EPICS_BASE)/../modules/soft/seq
# Set RULES here if you want to use build rules from elsewhere:
#RULES = $(MODULES)/build-rules
# EPICS_BASE usually appears last so other apps can override stuff:
#EPICS_BASE=/opt/epics/base
#Capfast users may need the following definitions
#CAPFAST_TEMPLATES=
#SCH2EDIF_PATH=
# These allow developers to override the RELEASE variable settings
# without having to modify the configure/RELEASE file itself.
-include $(TOP)/../RELEASE.local
-include $(TOP)/../RELEASE.$(EPICS_HOST_ARCH).local
-include $(TOP)/configure/RELEASE.local

View File

@@ -0,0 +1,4 @@
<h1>Release 4.0 IN DEVELOPMENT</h1>
<p>This is the first release of normativeTypesCPP that is part of an official
EPICS V4 release.
It is a major rewrite of the previous versions of normativeTypesCPP.</p>

View File

@@ -1,132 +1,7 @@
# normativeTypes Module
This document summarizes the changes to the module between releases.
## Release 5.2.2
- Fix NTTable::getColumnNames().
## Release 5.2.1 (EPICS 7.0.2, Dec 2018)
* No functional changes.
* Removal of declaration for unimplemented PVNTField::createAlarmLimit() and elimination of unused variables.
## Release 5.2.0 (EPICS 7.0.1, Dec 2017)
This release contains bug fixes and minor source updates needed to
build against the latest version of pvData.
## Release 5.1.2 (EPICS V4.6, Aug 2016)
The main changes since release 5.1.1 are:
* NTUnionBuilder: Add missing value() function
* Updated document: Now document all Normative Types
## Release 5.1.1
The main changes since release 5.0 are:
* Linux shared library version added
* Headers and source locations have changed
* Missing is_a implementations added
* NTAttribute::addTags() is now non-virtual
* New license file replaces LICENSE and COPYRIGHT
### Shared library version added
Linux shared library version numbers have been added by setting SHRLIB_VERSION
(to 5.1 in this case). So shared object will be libnt.so.5.1 instead of
libpvData.so.
### Headers and source locations have changed
Source has moved out of nt directory directly into src.
Headers have been moved into a pv directory. This facilitates using some IDEs
such as Qt Creator.
src/nt/ntscalar.cpp -> src/ntscalar.cpp
src/nt/ntscalar.h -> src/pv/ntscalar.h
### Missing is_a implementations added
is_a(PVStructurePtr const &) implementation has been added for each type.
## Release 5.0 (EPICS V4.5, Oct 2015)
This release adds support through wrapper classes and builders for the
remaining Normative Types:
* NTEnum
* NTMatrix
* NTURI
* NTAttribute
* NTContinuum
* NTHistogram
* NTAggregate
* NTUnion
* NTScalarMultiChannel
Release 5.0 therefore implements fully the
[16 Mar 2015 version](http://epics-pvdata.sourceforge.net/alpha/normativeTypes/normativeTypes_20150316.html)
of the normativeTypes specification.
Each wrapper class has an extended API:
* is_a now has a convenience overload taking a PVStructure.
* isCompatible, reporting introspection type compatibility, now has an overload
taking a Structure. The PVStructure version is retained as a convenience
method and for backwards compatibility.
* An isValid function now reports validity of a compatible PVStructure's data
with respect to the specification.
Other changes are:
* Support for NTAttributes extended as required by NTNDArray
(NTNDArrayAttributes).
* A new class for parsing NT IDs (NTID).
* Resolution of the confusion between column names and labels in NTTable and
improved API. Function for adding columns is now addColumn rather than add.
New getColumnNames function provided.
* isConnected is treated as an optional rather than a required field in
NTMultiChannelArray. isConnected() and addIsConnected() functions added to
wrapper and builder respectively.
* Unit tests for all new classes.
## Release 4.0 (EPICS V4.4, Dec 2014)
Release 4.0 IN DEVELOPMENT
===========
This is the first release of normativeTypesCPP that is part of an official
EPICS V4 release.
It is a major rewrite of the previous versions of normativeTypesCPP.
This release provides support through wrapper classes and builders for the
following Normative Types:
* NTScalar
* NTScalarArray
* NTNameValue
* NTTable
* NTMultiChannel
* NTNDArray
Each type has a wrapper class of the same name which has functions for checking
compatibility of existing PVStructures (isCompatible) and the reported types of
Structures (is_a), wraps existing PVStructures (wrap, wrapUnsafe) and provides
a convenient interface to all required and optional fields.
Each type has a builder which can create a Structure, a PVStructure or a
wrapper around a new PVStructure. In each case optional or extra fields can be
added and options such as choice of scalar type can be made.
Additional features are:
* Utility classes NTField and NTPVField for standard structure fields and
NTUtils for type IDs.
* Unit tests for the implemented classes.

22
documentation/TODO.html Normal file
View File

@@ -0,0 +1,22 @@
<h1>TODO</h1>
<h2>NTScalarArray</h2>
<p>NTScalarArrayBuilder::arrayValue</p>
<p>Should this be:</p>
<p>NTScalarArrayBuilder::value</p>
<p>This makes NTScalarArray consistent with other NTTypes.</p>
<h2>NTNameValue</h2>
<p>This does not have a value field like all the other NTTypes.
Perhaps instead of</p>
<pre><code>NTNameValue
string[] name
string[] value
</code></pre>
<p>It should be</p>
<pre><code>NTNameValue
value
string[] name
string[] value
</code></pre>
<h2>NTTable</h2>
<p>Should lables be label?
Compare with name,value from NTNameValue.</p>

View File

@@ -1,5 +1,37 @@
TODO
====
===========
Documentation for recently added types.
NTScalarArray
------------
NTScalarArrayBuilder::arrayValue
Should this be:
NTScalarArrayBuilder::value
This makes NTScalarArray consistent with other NTTypes.
NTNameValue
------------
This does not have a value field like all the other NTTypes.
Perhaps instead of
NTNameValue
string[] name
string[] value
It should be
NTNameValue
value
string[] name
string[] value
NTTable
----------
Should lables be label?
Compare with name,value from NTNameValue.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,289 @@
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" />
<title>EPICS pvDataCPP</title>
<link rel="stylesheet" type="text/css"
href="http://epics-pvdata.sourceforge.net/base.css" />
<link rel="stylesheet" type="text/css"
href="http://epics-pvdata.sourceforge.net/epicsv4.css" />
<style type="text/css">
/*<![CDATA[*/
.about { margin-left: 3em; margin-right: 3em; font-size: .83em}
table { margin-left: auto; margin-right: auto }
.diagram { text-align: center; margin: 2.5em 0 }
span.opt { color: grey }
span.nterm { font-style:italic }
span.term { font-family:courier }
span.user { font-family:courier }
span.user:before { content:"<" }
span.user:after { content:">" }
.nonnorm { font-style:italic }
p.ed { color: #AA0000 }
span.ed { color: #AA0000 }
p.ed.priv { display: inline; }
span.ed.priv { display: inline; }
/*]]>*/</style>
<!-- Script that generates the Table of Contents -->
<script type="text/javascript"
src="http://epics-pvdata.sourceforge.net/script/tocgen.js">
</script>
</head>
<body>
<div class="head">
<h1>EPICS pvDataCPP</h1>
<!-- Maturity: Working Draft or Request for Comments, or Recommendation, and date. -->
<h2 class="nocount">EPICS v4 Working Group, Working Draft, 23-July-2014</h2>
<dl>
<dt>Latest version:</dt>
<dd><a
href="ntCPP.html">ntCPP.html</a>
</dd>
<dt>This version:</dt>
<dd><a
href="ntCPP_20140723.html">ntCPP_20140723.html</a>
</dd>
<dt>Previous version:</dt>
<dd>None</dd>
<dt>Editors:</dt>
<dd>Marty Kraimer, BNL</dd>
<dd>Michael Davidsaver, BNL</dd>
<dd>Matej Sekoranja, CosyLab</dd>
</dl>
<p class="copyright">This product is made available subject to acceptance of the <a
href="http://epics-pvdata.sourceforge.net/LICENSE.html">EPICS open source
license.</a></p>
<hr />
</div>
<h2 class="nocount">Abstract</h2>
<p>EPICS Version 4 provides efficient
storage, access, and communication, of memory resident structured data.
pvData is the storage compoment.
pvDataCPP is the C++ implementation of pvData.
It is one part of the set of related products in the EPICS
V4 control system programming environment:<br />
<a href="http://epics-pvdata.sourceforge.net/relatedDocumentsV4.html">relatedDocumentsV4.html</a>
</p>
<h2 class="nocount">Status of this Document</h2>
<p>For now this is a working copy so it is not the same as "This version" shown above.</p>
<p>This is the 23-July-2014 version of the C++ implementation of pvData.
</p>
<p>RELEASE_NOTES.md provides changes since the last release.
TODO.md describes things to do before the next release.
</p>
<div id="toc">
<h2 class="nocount" style="page-break-before: always">Table of Contents</h2>
</div>
<div id="contents" class="contents">
<body>
<h1 style="text-align: center">EPICS normative type C++ implementation
</h1>
<h2 class="nocount" id="L50">Draft, 4-Nov-2012</h2>
<dl>
<dt>This version:</dt>
<dd><a href="http://epics-pvdata.hg.sourceforge.net/hgweb/epics-pvdata/normativeTypesCPP/raw-file/tip/documentation/ntCPP.html">ntCPP.html</a></dd>
<dt>Editors:</dt>
<dd>Matej Sekoranja, CosyLab<br>
Marty Kraimer, BNL
</dd>
</dl>
<hr />
</div>
<h2>Introduction</h2>
<p>This section describes the C++ implemmentation of normative types. Two (2) helper classes are implemented,
ntNameValue and NTTable respectively. </p>
<h3>Normative Type Fields.</h3>
<p>These are helper classes for creating standard fields for normative types.
There is a single instance of this class, which is obtained via NTField::get().
</p>
<pre>class NTField: NoDefaultMethods {
public:
static NTFieldPtr get();
~NTField() {}
PVStructurePtr createEnumerated(StringArray const &amp; choices);
PVStructurePtr createTimeStamp();
PVStructurePtr createAlarm();
PVStructurePtr createDisplay();
PVStructurePtr createAlarmLimit();
PVStructurePtr createControl();
PVStructureArrayPtr createEnumeratedArray();
PVStructureArrayPtr createTimeStampArray();
PVStructureArrayPtr createAlarmArray();
};</pre>
<p>where</p>
<dl>
<dt>createEnumerated</dt>
<dd>Create an introspection interface for an enumerated structure.</dd>
<dt>createTimeStamp</dt>
<dd>Create an interspection interface for a timeStamp structure.</dd>
<dt>createAlarm</dt>
<dd>Create an interspection interface for an alarm structure.</dd>
<dt>createDisplay</dt>
<dd>Create an introsepecion interface for a display structure.</dd>
<dt>createAlarmLimit</dt>
<dd>Create an introspection interface for an alarm limit structure.</dd>
<dt>createControl</dt>
<dd>Create an introspection interface for a control structure.</dd>
<dt>createEnumeratedArray</dt>
<dd>Create an introspection interface for an structureArray of enumerated
structures.</dd>
<dt>createTimeStampArray</dt>
<dd>Create an introspection interface for an structureArray of timeStamp
structures.</dd>
<dt>createAlarmArray</dt>
<dd>Create an introspection interface for an structureArray of alarm
structures.</dd>
</dl>
<h3>NTNameValue</h3>
<p>These are helper classes for NTNameValue</p>
<pre>class NTNameValue : private NoDefaultMethods
{
public:
static bool isNTNameValue(PVStructurePtr const & pvStructure);
static NTNameValuePtr create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm);
static NTNameValuePtr create(
PVStructurePtr const & pvStructure);
~NTNameValue();
PVStringPtr getFunction();
void attachTimeStamp(PVTimeStamp &amp;pvTimeStamp);
void attachAlarm(PVAlarm &amp;pvAlarm);
PVStructurePtr getPVStructure();
PVStructurePtr getTimeStamp();
PVStructurePtr getAlarm();
PVStringArrayPtr getNames();
PVStringArrayPtr getValues();
};</pre>
<p>where</p>
<dl>
<dt>isNTNameValue</dt>
<dd>Is the structure a NTNameValue structure?</dd>
<dt>create</dt>
<dd>Create an NTNameValue that has the associated fields.</dd>
<dt>~NTNameValue</dt>
<dd>The destructor.</dd>
<dt>getFunction</dt>
<dd>Get the function field. This can be null.</dd>
<dt>attachTimeStamp</dt>
<dd>The timeStamp field of the NTNameValue is atttached to the
pvTimeStamp.</dd>
<dt>attachAlarm</dt>
<dd>The alarm field of the NTNameValue is atttached to the alarm.</dd>
<dt>getPVStructure</dt>
<dd>Get the pvStructure that this NTNameValue contains.</dd>
<dt>getTimeStamp</dt>
<dd>Get the timeStamp field.</dd>
<dt>getAlarm</dt>
<dd>Get the alarm field.</dd>
<dt>getNames</dt>
<dd>Get the names field.</dd>
<dt>getValues</dt>
<dd>Get the values field.</dd>
</dl>
<h3>NTTable</h3>
<p>These are helper classes for NTTable</p>
<pre>class NTTable: private NoDefaultMethods
{
public:
static bool isNTTable(PVStructurePtr const & pvStructure);
static PVStructure::shared_pointer create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm,
int numberValues,
FieldConstPtrArray valueFields);
static NTTablePtr create(
bool hasFunction,bool hasTimeStamp, bool hasAlarm,
StringArray const & valueNames,
FieldConstPtrArray const &valueFields);
static NTTablePtr clone(PVStructurePtr const &);
~NTTable();
PVStringPtr getFunction();
void attachTimeStamp(PVTimeStamp &amp;pvTimeStamp);
void attachAlarm(PVAlarm &amp;pvAlarm);
PVStructurePtr getPVStructure();
PVStructurePtr getTimeStamp();
PVStructurePtr getAlarm();
PVStringArrayPtr getLabel();
size_t getNumberValues();
FieldConstPtr getField(int index);
PVFieldPtr getPVField(int index);
};</pre>
<p>where</p>
<dl>
<dt>isNTTable</dt>
<dd>y</dd>
<dt>create</dt>
<dd>Create an NTTable that has the associated fields.</dd>
<dt>~NTTable</dt>
<dd>The destructor.</dd>
<dt>getFunction</dt>
<dd>Get the function field. This can be null.</dd>
<dt>attachTimeStamp</dt>
<dd>The timeStamp field of the NTTable is atttached to the pvTimeStamp.</dd>
<dt>attachAlarm</dt>
<dd>The alarm field of the NTTable is atttached to the alarm.</dd>
<dt>getPVStructure</dt>
<dd>Get the pvStructure that this NTTable contains.</dd>
<dt>getTimeStamp</dt>
<dd>Get the timeStamp field.</dd>
<dt>getAlarm</dt>
<dd>Get the alarm field.</dd>
<dt>getLabel</dt>
<dd>Get the label field.</dd>
<dt>getNumberValues</dt>
<dd>Get the number of value fields.</dd>
<dt>getField</dt>
<dd>Get the introspection interface for the specified field.</dd>
<dt>getPVField</dt>
<dd>Get the data field for the specified field.</dd>
</dl>
<h2>MTMultiChannel</h2>
<pre>
structure NTMultiChannel
union_t[] value
string[] channelName
time_t timeStamp :opt // time when data collected
alarm_t alarm :opt // alarm associated with data collection
int[] severity :opt // alarm severity for each value
int[] status :opt // alarm status for each value
string[] message :opt // alarm message for each value
long[] secondsPastEpoch :opt // seconds for each value.
int[] nanoseconds :opt // nanoseconds for each value
string descriptor :opt // descriptor data
</pre>
</div>
</body>
</html>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -6,35 +6,20 @@
#
# Author: Ralph Lange <ralph.lange@gmx.de>
# Copyright (C) 2013 Helmholtz-Zentrum Berlin für Materialien und Energie GmbH
# Copyright (C) 2014-2016 ITER Organization.
# Copyright (C) 2014-2015 ITER Organization.
# All rights reserved. Use is subject to license terms.
installTool () {
local module=$1
local version=$2
wget -nv https://openepics.ci.cloudbees.com/job/${module}-${version}_Build/lastSuccessfulBuild/artifact/${module,,}-${version}.CB-dist.tar.gz
tar -xzf ${module,,}-${version}.CB-dist.tar.gz
}
installE4 () {
local module=$1
local branch=$2
wget -nv https://openepics.ci.cloudbees.com/job/e4-cpp-${module}-${branch}-build/BASE=${BASE}/lastSuccessfulBuild/artifact/${module}.CB-dist.tar.gz
tar -xzf ${module}.CB-dist.tar.gz
}
###########################################
# Defaults for EPICS Base
# Determine EPICS Base version
DEFAULT_BASE=3.15.4
BASE=${BASE:-${DEFAULT_BASE}}
DEFAULT_BASE=3.14.12.5
###########################################
# Dependent module branches
BASE=${1:-${DEFAULT_BASE}}
USE_MB=${2:-"MB_NO"}
PVDATA_BRANCH="master"
# Dependent module branches (empty = master)
PVCOMMON_BRANCH="Release-4.1-"
PVDATA_BRANCH="Release-5.0-"
###########################################
# Fetch and unpack dependencies
@@ -45,10 +30,15 @@ rm -fr ${STUFF}
mkdir -p ${STUFF}
cd ${STUFF}
installTool Boost 1.61.0
installTool Base ${BASE}
wget -nv https://openepics.ci.cloudbees.com/job/Base-${BASE}_Build/lastSuccessfulBuild/artifact/base-${BASE}.CB-dist.tar.gz
wget -nv https://openepics.ci.cloudbees.com/job/pvDataCPP_${PVDATA_BRANCH}Build/BASE=${BASE},USE_MB=MB_NO/lastSuccessfulBuild/artifact/pvData.CB-dist.tar.gz
tar -xzf base-${BASE}.CB-dist.tar.gz
tar -xzf pvData.CB-dist.tar.gz
installE4 pvData ${PVDATA_BRANCH}
if [ "${USE_MB}" = "MB_YES" ]; then
wget -nv https://openepics.ci.cloudbees.com/job/pvCommonCPP_${PVCOMMON_BRANCH}Build/BASE=${BASE},USE_MB=MB_YES/lastSuccessfulBuild/artifact/pvCommon.CB-dist.tar.gz
tar -xzf pvCommon.CB-dist.tar.gz
fi
###########################################
# Build
@@ -72,6 +62,6 @@ make distclean all
make runtests
###########################################
# Create cache
# Create distribution
tar --exclude=test* -czf normativeTypes.CB-dist.tar.gz lib include

View File

@@ -6,31 +6,14 @@
#
# Author: Ralph Lange <ralph.lange@gmx.de>
# Copyright (C) 2013 Helmholtz-Zentrum Berlin für Materialien und Energie GmbH
# Copyright (C) 2014-2016 ITER Organization.
# Copyright (C) 2014-2015 ITER Organization.
# All rights reserved. Use is subject to license terms.
installTool () {
local module=$1
local version=$2
wget -nv https://openepics.ci.cloudbees.com/job/${module}-${version}_Build/lastSuccessfulBuild/artifact/${module,,}-${version}.CB-dist.tar.gz
tar -xzf ${module,,}-${version}.CB-dist.tar.gz
}
installE4 () {
local module=$1
local branch=$2
wget -nv https://openepics.ci.cloudbees.com/job/e4-cpp-${module}-${branch}-build/BASE=${BASE}/lastSuccessfulBuild/artifact/${module}.CB-dist.tar.gz
tar -xzf ${module}.CB-dist.tar.gz
}
###########################################
# Defaults for EPICS Base and parameters
# Set EPICS Base version and upload target
BASE=3.15.4
PUBLISH=${PUBLISH:-NO}
BRANCH=${BRANCH:-master}
BASE=3.15.2
PUBLISH=${1:-DONT}
###########################################
# Fetch and unpack dependencies
@@ -41,14 +24,16 @@ rm -fr ${STUFF}
mkdir -p ${STUFF}
cd ${STUFF}
installTool Doxygen 1.8.11
wget -nv https://openepics.ci.cloudbees.com/job/Doxygen-1.8.3_Build/lastSuccessfulBuild/artifact/doxygen-1.8.3.CB-dist.tar.gz
tar -xzf doxygen-1.8.3.CB-dist.tar.gz
###########################################
# Generate
cd ${WORKSPACE}
installE4 normativeTypes ${BRANCH}
wget -nv https://openepics.ci.cloudbees.com/job/normativeTypesCPP_Build/BASE=${BASE},USE_MB=MB_NO/lastSuccessfulBuild/artifact/normativeTypes.CB-dist.tar.gz
tar -xzf normativeTypes.CB-dist.tar.gz
export PATH=${STUFF}/bin:${PATH}
@@ -60,7 +45,7 @@ doxygen
if [ "${PUBLISH}" != "DONT" ]; then
# Upload explicit dummy to ensure target directory exists
echo "Created by CloudBees Jenkins upload job. Should be deleted as part of the job." > DUMMY
rsync -q -e ssh DUMMY epics-jenkins@web.sourceforge.net:/home/project-web/epics-pvdata/htdocs/docbuild/normativeTypesCPP/${PUBLISH}/
rsync -q -e ssh DUMMY epics-jenkins@web.sourceforge.net:/home/project-web/epics-pvdata/htdocs/docbuild/normativeTypesCPP/${PUBLISH}/DUMMY
rsync -aqP --delete -e ssh documentation epics-jenkins@web.sourceforge.net:/home/project-web/epics-pvdata/htdocs/docbuild/normativeTypesCPP/${PUBLISH}/
fi

View File

@@ -1,26 +1,30 @@
TOP = ..
include $(TOP)/configure/CONFIG
INC += pv/nt.h
INC += pv/ntutils.h
INC += pv/ntid.h
INC += pv/ntfield.h
INC += pv/ntscalar.h
INC += pv/ntscalarArray.h
INC += pv/ntnameValue.h
INC += pv/nttable.h
INC += pv/ntmultiChannel.h
INC += pv/ntscalarMultiChannel.h
INC += pv/ntndarray.h
INC += pv/ntmatrix.h
INC += pv/ntenum.h
INC += pv/ntunion.h
INC += pv/ntaggregate.h
INC += pv/ntattribute.h
INC += pv/ntcontinuum.h
INC += pv/nthistogram.h
INC += pv/nturi.h
INC += pv/ntndarrayAttribute.h
SRC = $(TOP)/src
SRC_DIRS += $(SRC)/nt
INC += nt.h
INC += ntutils.h
INC += ntid.h
INC += ntfield.h
INC += ntscalar.h
INC += ntscalarArray.h
INC += ntnameValue.h
INC += nttable.h
INC += ntmultiChannel.h
INC += ntscalarMultiChannel.h
INC += ntndarray.h
INC += ntmatrix.h
INC += ntenum.h
INC += ntunion.h
INC += ntaggregate.h
INC += ntattribute.h
INC += ntcontinuum.h
INC += nthistogram.h
INC += nturi.h
INC += ntndarrayAttribute.h
LIBSRCS += ntutils.cpp
LIBSRCS += ntid.cpp
@@ -46,8 +50,5 @@ LIBRARY = nt
nt_LIBS += pvData Com
# shared library ABI version.
SHRLIB_VERSION ?= 5.2.2
include $(TOP)/configure/RULES

View File

@@ -1,7 +1,8 @@
/* nt.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NT_H
#define NT_H

View File

@@ -1,7 +1,8 @@
/* ntaggregate.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -170,15 +171,15 @@ NTAggregateBuilder::shared_pointer NTAggregateBuilder::add(string const & name,
const std::string NTAggregate::URI("epics:nt/NTAggregate:1.0");
NTAggregate::shared_pointer NTAggregate::wrap(PVStructurePtr const & pvStructure)
NTAggregate::shared_pointer NTAggregate::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTAggregate::shared_pointer NTAggregate::wrapUnsafe(PVStructurePtr const & pvStructure)
NTAggregate::shared_pointer NTAggregate::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTAggregate(pvStructure));
return shared_pointer(new NTAggregate(structure));
}
bool NTAggregate::is_a(StructureConstPtr const & structure)
@@ -186,12 +187,6 @@ bool NTAggregate::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTAggregate::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTAggregate::isCompatible(StructureConstPtr const &structure)
{
if (structure.get() == 0) return false;

View File

@@ -1,7 +1,8 @@
/* ntaggregate.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTAGGREGATE_H
#define NTAGGREGATE_H
@@ -41,90 +42,89 @@ namespace detail {
POINTER_DEFINITIONS(NTAggregateBuilder);
/**
* Adds dispersion field to the NTAggregate.
* Add dispersion field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addDispersion();
/**
* Adds first field to the NTAggregate.
* Add first field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addFirst();
/**
* Adds firstTimeStamp field to the NTAggregate.
* Add firstTimeStamp field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addFirstTimeStamp();
/**
* Adds last field to the NTAggregate.
* Add last field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addLast();
/**
* Adds lastTimeStamp field to the NTAggregate.
* Add lastTimeStamp field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addLastTimeStamp();
/**
* Adds max field to the NTAggregate.
* Add max field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addMax();
/**
* Adds min field to the NTAggregate.
* Add min field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addMin();
/**
* Adds descriptor field to the NTAggregate.
* Add descriptor field to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTAggregate.
* Add alarm structure to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTAggregate.
* Add timeStamp structure to the NTAggregate.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTAggregate.
* Create a <b>Structure</b> that represents NTAggregate.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTAggregate.
* Create a <b>PVStructure</b> that represents NTAggregate.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTAggregate</b> instance.
* Create a <b>NTAggregate</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTAggregate</b>.
*/
NTAggregatePtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTAggregateBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -171,92 +171,65 @@ public:
static const std::string URI;
/**
* Creates an NTAggregate wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTAggregate
* and if so returns an NTAggregate which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return the NTAggregate instance on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTAggregate.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTAggregate.
* @return NTAggregate instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTAggregate wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTAggregate or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return the NTAggregate instance
* Wrap (aka dynamic cast, or wrap) the structure to NTAggregate without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTAggregate.
* @return NTAggregate instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTAggregate.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTAggregate through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAggregate
* Is the structure an NTAggregate.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTAggregate.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTAggregate.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTAggregate through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test.
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAggregate.
* Is the structure an NTAggregate.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTAggregate.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTAggregate.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTAggregate through introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAggregate
* Is the Structure compatible with NTAggregate.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTAggregate.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTAggregate.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTAggregate through introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAggregate
* Is the PVStructure compatible with NTAggregate.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTAggregate.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTAggregate.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value data as
* well as the introspection data.
* Checks if the specified structure is a valid NTAggregate.
*
* @return (false,true) if wrapped PVStructure a valid NTAggregate
* Checks whether the wrapped structure is valid with respect to this
* version of NTAggregate
* @return (false,true) if (is not, is) a valid NTAggregate.
*/
bool isValid();
/**
* Creates an NTAggregate builder instance.
* Create a NTAggregate builder instance.
* @return builder instance.
*/
static NTAggregateBuilderPtr createBuilder();
@@ -267,96 +240,96 @@ public:
~NTAggregate() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the value field.
* @return the value field.
* Get the value field.
* @return The PVDouble for the value.
*/
epics::pvData::PVDoublePtr getValue() const;
/**
* Returns the N field.
* @return the N field.
* Get the N field.
* @return The PVLong for the N field.
*/
epics::pvData::PVLongPtr getN() const;
/**
* Returns the dispersion field.
* @return the dispersion or null if no such field.
* Get the dispersion field.
* @return The PVDouble for the dispersion which may be null
*/
epics::pvData::PVDoublePtr getDispersion() const;
/**
* Returns the first field.
* @return the first field or null if no such field.
* Get the first field.
* @return The PVDouble for the first field which may be null
*/
epics::pvData::PVDoublePtr getFirst() const;
/**
* Returns the firstTimeStamp field.
* @return the firstTimeStamp field or null if no such field.
* Get the firstTimeStamp field.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getFirstTimeStamp() const;
/**
* Returns the last field.
* @return the last field or null if no such field.
* Get the last field.
* @return The PVDouble for the last field which may be null
*/
epics::pvData::PVDoublePtr getLast() const;
/**
* Returns the lastTimeStamp field.
* @return the lastTimeStamp field or null if no such field.
* Get the lastTimeStamp field.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getLastTimeStamp() const;
/**
* Returns the max field.
* @return the max field or null if no such field.
* Get the max field.
* @return The PVDouble for the max field which may be null
*/
epics::pvData::PVDoublePtr getMax() const;
/**
* Returns the min field.
* @return the min field or null if no such field.
* Get the min field.
* @return The PVDouble for the max field which may be null
*/
epics::pvData::PVDoublePtr getMin() const;

View File

@@ -1,7 +1,8 @@
/* ntattribute.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -107,15 +108,15 @@ NTAttributeBuilder::shared_pointer NTAttributeBuilder::add(string const & name,
const std::string NTAttribute::URI("epics:nt/NTAttribute:1.0");
NTAttribute::shared_pointer NTAttribute::wrap(PVStructurePtr const & pvStructure)
NTAttribute::shared_pointer NTAttribute::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTAttribute::shared_pointer NTAttribute::wrapUnsafe(PVStructurePtr const & pvStructure)
NTAttribute::shared_pointer NTAttribute::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTAttribute(pvStructure));
return shared_pointer(new NTAttribute(structure));
}
bool NTAttribute::is_a(StructureConstPtr const & structure)
@@ -123,11 +124,6 @@ bool NTAttribute::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTAttribute::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTAttribute::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;

267
src/nt/ntattribute.h Normal file
View File

@@ -0,0 +1,267 @@
/* ntattribute.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTATTRIBUTE_H
#define NTATTRIBUTE_H
#ifdef epicsExportSharedSymbols
# define ntattributeEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntattributeEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntattributeEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTAttribute;
typedef std::tr1::shared_ptr<NTAttribute> NTAttributePtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTAttribute.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTAttributeBuilder :
public std::tr1::enable_shared_from_this<NTAttributeBuilder>
{
public:
POINTER_DEFINITIONS(NTAttributeBuilder);
/**
* Add tags field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
virtual shared_pointer addTags();
/**
* Add descriptor field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Create a <b>Structure</b> that represents NTAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTAttribute</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTAttribute</b>.
*/
NTAttributePtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
protected://private:
NTAttributeBuilder();
void reset();
bool tags;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTAttribute;
};
}
typedef std::tr1::shared_ptr<detail::NTAttributeBuilder> NTAttributeBuilderPtr;
/**
* @brief Convenience Class for NTAttribute
*
* @author dgh
*/
class epicsShareClass NTAttribute
{
public:
POINTER_DEFINITIONS(NTAttribute);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTAttribute.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTAttribute.
* @return NTAttribute instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTAttribute without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTAttribute.
* @return NTAttribute instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTAttribute.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTAttribute.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTAttribute.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTAttribute.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTAttribute.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTAttribute.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTAttribute.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTAttribute.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTAttribute.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTAttribute
* @return (false,true) if (is not, is) a valid NTAttribute.
*/
bool isValid();
/**
* Create a NTAttribute builder instance.
* @return builder instance.
*/
static NTAttributeBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTAttribute() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the name field.
* @return The PVString for the name.
*/
epics::pvData::PVStringPtr getName() const;
/**
* Get the value field.
* @return The PVUnion for the values.
*/
epics::pvData::PVUnionPtr getValue() const;
/**
* Get the tags field.
* @return The PVStringArray for the tags, which may be null.
*/
epics::pvData::PVStringArrayPtr getTags() const;
private:
NTAttribute(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTAttribute;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTAttributeBuilder;
};
}}
#endif /* NTATTRIBUTE_H */

View File

@@ -1,7 +1,8 @@
/* ntcontinuum.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -99,15 +100,15 @@ NTContinuumBuilder::shared_pointer NTContinuumBuilder::add(string const & name,
const std::string NTContinuum::URI("epics:nt/NTContinuum:1.0");
NTContinuum::shared_pointer NTContinuum::wrap(PVStructurePtr const & pvStructure)
NTContinuum::shared_pointer NTContinuum::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTContinuum::shared_pointer NTContinuum::wrapUnsafe(PVStructurePtr const & pvStructure)
NTContinuum::shared_pointer NTContinuum::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTContinuum(pvStructure));
return shared_pointer(new NTContinuum(structure));
}
bool NTContinuum::is_a(StructureConstPtr const & structure)
@@ -115,11 +116,6 @@ bool NTContinuum::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTContinuum::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTContinuum::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;

262
src/nt/ntcontinuum.h Normal file
View File

@@ -0,0 +1,262 @@
/* ntcontinuum.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTCONTINUUM_H
#define NTCONTINUUM_H
#ifdef epicsExportSharedSymbols
# define ntcontinuumEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntcontinuumEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntcontinuumEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTContinuum;
typedef std::tr1::shared_ptr<NTContinuum> NTContinuumPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTContinuum.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTContinuumBuilder :
public std::tr1::enable_shared_from_this<NTContinuumBuilder>
{
public:
POINTER_DEFINITIONS(NTContinuumBuilder);
/**
* Add descriptor field to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Create a <b>Structure</b> that represents NTContinuum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTContinuum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTContinuum</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTContinuum</b>.
*/
NTContinuumPtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTContinuumBuilder();
void reset();
bool dim;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTContinuum;
};
}
typedef std::tr1::shared_ptr<detail::NTContinuumBuilder> NTContinuumBuilderPtr;
/**
* @brief Convenience Class for NTContinuum
*
* @author dgh
*/
class epicsShareClass NTContinuum
{
public:
POINTER_DEFINITIONS(NTContinuum);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTContinuum.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTContinuum.
* @return NTContinuum instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTContinuum without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTContinuum.
* @return NTContinuum instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTContinuum.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTContinuum.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTContinuum.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTContinuum.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTContinuum.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTContinuum.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTContinuum.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTContinuum.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTContinuum.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTContinuum
* @return (false,true) if (is not, is) a valid NTContinuum.
*/
bool isValid();
/**
* Create a NTContinuum builder instance.
* @return builder instance.
*/
static NTContinuumBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTContinuum() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the base field.
* @return The PVDoubleArray for the base.
*/
epics::pvData::PVDoubleArrayPtr getBase() const;
/**
* Get the value field.
* @return The PVDoubleArray for the values.
*/
epics::pvData::PVDoubleArrayPtr getValue() const;
/**
* Get the units field.
* @return The PVStringArray for the units.
*/
epics::pvData::PVStringArrayPtr getUnits() const;
private:
NTContinuum(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTContinuum;
epics::pvData::PVDoubleArrayPtr pvValue;
friend class detail::NTContinuumBuilder;
};
}}
#endif /* NTCONTINUUM_H */

View File

@@ -1,7 +1,8 @@
/* ntenum.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -98,15 +99,15 @@ NTEnumBuilder::shared_pointer NTEnumBuilder::add(string const & name, FieldConst
const std::string NTEnum::URI("epics:nt/NTEnum:1.0");
NTEnum::shared_pointer NTEnum::wrap(PVStructurePtr const & pvStructure)
NTEnum::shared_pointer NTEnum::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTEnum::shared_pointer NTEnum::wrapUnsafe(PVStructurePtr const & pvStructure)
NTEnum::shared_pointer NTEnum::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTEnum(pvStructure));
return shared_pointer(new NTEnum(structure));
}
bool NTEnum::is_a(StructureConstPtr const & structure)
@@ -114,11 +115,6 @@ bool NTEnum::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTEnum::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTEnum::isCompatible(StructureConstPtr const &structure)
{
if (structure.get() == 0) return false;

View File

@@ -1,7 +1,8 @@
/* ntenum.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTENUM_H
#define NTENUM_H
@@ -41,48 +42,47 @@ namespace detail {
POINTER_DEFINITIONS(NTEnumBuilder);
/**
* Adds descriptor field to the NTEnum.
* Add descriptor field to the NTEnum.
* @return this instance of <b>NTEnumBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTEnum.
* Add alarm structure to the NTEnum.
* @return this instance of <b>NTEnumBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTEnum.
* Add timeStamp structure to the NTEnum.
* @return this instance of <b>NTEnumBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTEnum.
* Create a <b>Structure</b> that represents NTEnum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTEnum.
* Create a <b>PVStructure</b> that represents NTEnum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTEnum</b> instance.
* Create a <b>NTEnum</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTEnum</b>.
*/
NTEnumPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTEnumBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -122,90 +122,65 @@ public:
static const std::string URI;
/**
* Creates an NTEnum wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTEnum or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTEnum instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTEnum.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTEnum.
* @return NTEnum instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTEnum wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTEnum or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTEnum instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTEnum without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTEnum.
* @return NTEnum instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTEnum.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTEnum through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test.
* @return (false,true) if the specified Structure (is not, is) a compatible NTEnum.
* Is the structure an NTEnum.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTEnum.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTEnum.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTEnum through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTEnum
* Is the structure an NTEnum.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTEnum.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTEnum.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTEnum through the introspection interface.
*
* @param structure The Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTEnum
* Is the Structure compatible with NTEnum.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTEnum.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTEnum.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTEnum through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTEnum
* Is the PVStructure compatible with NTEnum.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTEnum.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTEnum.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTEnum.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTEnum
* Checks whether the wrapped structure is valid with respect to this
* version of NTEnum
* @return (false,true) if (is not, is) a valid NTEnum.
*/
bool isValid();
/**
* Creates an NTEnum builder instance.
* Create a NTEnum builder instance.
* @return builder instance.
*/
static NTEnumBuilderPtr createBuilder();
@@ -216,48 +191,48 @@ public:
~NTEnum() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or or null if no such field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or or null if no such field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the value field.
* @return the value field.
* @return The PVStructure for the values.
*/
epics::pvData::PVStructurePtr getValue() const;

View File

@@ -1,7 +1,8 @@
/* ntfield.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <pv/lock.h>

View File

@@ -1,7 +1,8 @@
/* ntfield.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTFIELD_H
#define NTFIELD_H
@@ -46,7 +47,7 @@ class epicsShareClass NTField {
public:
POINTER_DEFINITIONS(NTField);
/**
* Gets the single implementation of this class.
* get the single implementation of this class.
* @return the implementation
*/
static NTFieldPtr get();
@@ -54,97 +55,84 @@ public:
* destructor
*/
~NTField() {}
/**
* Is field an enumerated structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) an enumerated structure.
*/
bool isEnumerated(epics::pvData::FieldConstPtr const & field);
/**
* Is field a timeStamp structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) a timeStamp structure.
*/
bool isTimeStamp(epics::pvData::FieldConstPtr const & field);
/**
* Is field an alarm structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) an alarm structure.
*/
bool isAlarm(epics::pvData::FieldConstPtr const & field);
/**
* Is field a display structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) a display structure.
*/
bool isDisplay(epics::pvData::FieldConstPtr const & field);
/**
* Is field an alarmLimit structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) an alarmLimit structure.
*/
bool isAlarmLimit(epics::pvData::FieldConstPtr const & field);
/**
* Is field a control structure.
* @param field the field to test.
* @param field The field to test.
* @return (false,true) if field (is not,is) a control structure.
*/
bool isControl(epics::pvData::FieldConstPtr const & field);
/**
* Creates an enumerated structure.
* Create an enumerated structure.
* @return an enumerated structure.
*/
epics::pvData::StructureConstPtr createEnumerated();
/**
* Creates a timeStamp structure.
* Create a timeStamp structure.
* @return a timeStamp structure.
*/
epics::pvData::StructureConstPtr createTimeStamp();
/**
* Creates an alarm structure.
* Create an alarm structure.
* @return an alarm structure.
*/
epics::pvData::StructureConstPtr createAlarm();
/**
* Creates a display structure.
* Create a display structure.
* @return a displayalarm structure.
*/
epics::pvData::StructureConstPtr createDisplay();
/**
* Creates a control structure.
* Create a control structure.
* @return a control structure.
*/
epics::pvData::StructureConstPtr createControl();
/**
* Creates an array of enumerated structures.
* Create an array of enumerated structures.
* @return an array of enumerated structures.
*/
epics::pvData::StructureArrayConstPtr createEnumeratedArray();
/**
* Creates an array of timeStamp structures.
* Create an array of timeStamp structures.
* @return an array of timeStamp structures.
*/
epics::pvData::StructureArrayConstPtr createTimeStampArray();
/**
* Creates an array of alarm structures.
* Create an array of alarm structures.
* @return an array of alarm structures.
*/
epics::pvData::StructureArrayConstPtr createAlarmArray();
private:
NTField();
epics::pvData::FieldCreatePtr fieldCreate;
@@ -161,66 +149,62 @@ class epicsShareClass PVNTField {
public:
POINTER_DEFINITIONS(PVNTField);
/**
* Returns the single implementation of this class.
* get the single implementation of this class.
* @return the implementation
*/
static PVNTFieldPtr get();
/**
* destructor
*/
~PVNTField() {}
/**
* Creates an enumerated PVStructure.
* Create an enumerated PVStructure.
* @param choices The array of choices.
* @return an enumerated PVStructure.
* @return an enumerated PVStructure..
*/
epics::pvData::PVStructurePtr createEnumerated(
epics::pvData::StringArray const & choices);
/**
* Creates a timeStamp PVStructure.
* @return a timeStamp PVStructure.
* Create a timeStamp PVStructure.
* @return a timeStamp PVStructure..
*/
epics::pvData::PVStructurePtr createTimeStamp();
/**
* Creates an alarm PVStructure.
* @return an alarm PVStructure.
* Create an alarm PVStructure.
* @return an alarm PVStructure..
*/
epics::pvData::PVStructurePtr createAlarm();
/**
* Creates a display PVStructure.
* @return a display PVStructure.
* Create a display PVStructure.
* @return a display PVStructure..
*/
epics::pvData::PVStructurePtr createDisplay();
/**
* Creates a control PVStructure.
* @return a control PVStructure.
* Create an alarmLimit PVStructure.
* @return an alarmLimit PVStructure..
*/
epics::pvData::PVStructurePtr createAlarmLimit();
/**
* Create a control PVStructure.
* @return a control PVStructure..
*/
epics::pvData::PVStructurePtr createControl();
/**
* Creates an enumerated PVStructureArray.
* @return an enumerated PVStructureArray.
* Create an enumerated PVStructureArray.
* @return an enumerated PVStructureArray..
*/
epics::pvData::PVStructureArrayPtr createEnumeratedArray();
/**
* Creates a timeStamp PVStructureArray.
* @return a timeStamp PVStructureArray.
* Create a timeStamp PVStructureArray.
* @return a timeStamp PVStructureArray
*/
epics::pvData::PVStructureArrayPtr createTimeStampArray();
/**
* Creates an alarm PVStructureArray.
* @return an alarm PVStructureArray.
* Create an alarm PVStructureArray.
* @return an alarm PVStructureArray..
*/
epics::pvData::PVStructureArrayPtr createAlarmArray();
private:
PVNTField();
epics::pvData::PVDataCreatePtr pvDataCreate;

View File

@@ -1,7 +1,8 @@
/* ntcontinuum.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -112,15 +113,15 @@ NTHistogramBuilder::shared_pointer NTHistogramBuilder::add(string const & name,
const std::string NTHistogram::URI("epics:nt/NTHistogram:1.0");
NTHistogram::shared_pointer NTHistogram::wrap(PVStructurePtr const & pvStructure)
NTHistogram::shared_pointer NTHistogram::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTHistogram::shared_pointer NTHistogram::wrapUnsafe(PVStructurePtr const & pvStructure)
NTHistogram::shared_pointer NTHistogram::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTHistogram(pvStructure));
return shared_pointer(new NTHistogram(structure));
}
bool NTHistogram::is_a(StructureConstPtr const & structure)
@@ -128,11 +129,6 @@ bool NTHistogram::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTHistogram::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTHistogram::isCompatible(StructureConstPtr const &structure)
{
if(!structure.get()) return false;

277
src/nt/nthistogram.h Normal file
View File

@@ -0,0 +1,277 @@
/* nthistogram.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTHISTOGRAM_H
#define NTHISTOGRAM_H
#ifdef epicsExportSharedSymbols
# define nthistogramEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef nthistogramEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef nthistogramEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTHistogram;
typedef std::tr1::shared_ptr<NTHistogram> NTHistogramPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTHistogram.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTHistogramBuilder :
public std::tr1::enable_shared_from_this<NTHistogramBuilder>
{
public:
POINTER_DEFINITIONS(NTHistogramBuilder);
/**
* Set a scalar type of value field array.
* @param scalarType the value type.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType scalarType);
/**
* Add descriptor field to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Create a <b>Structure</b> that represents NTHistogram.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTHistogram.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTHistogram</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTHistogram</b>.
*/
NTHistogramPtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTHistogramBuilder();
void reset();
bool valueTypeSet;
epics::pvData::ScalarType valueType;
bool dim;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTHistogram;
};
}
typedef std::tr1::shared_ptr<detail::NTHistogramBuilder> NTHistogramBuilderPtr;
/**
* @brief Convenience Class for NTHistogram
*
* @author dgh
*/
class epicsShareClass NTHistogram
{
public:
POINTER_DEFINITIONS(NTHistogram);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTHistogram.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTHistogram.
* @return NTHistogram instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTHistogram without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTHistogram.
* @return NTHistogram instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTHistogram.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTHistogram.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTHistogram.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTHistogram.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTHistogram.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTHistogram.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTHistogram.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTHistogram.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTHistogram.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTHistogram
* @return (false,true) if (is not, is) a valid NTHistogram.
*/
bool isValid();
/**
* Create a NTHistogram builder instance.
* @return builder instance.
*/
static NTHistogramBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTHistogram() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the base field.
* @return The PVDoubleArray for the base.
*/
epics::pvData::PVDoubleArrayPtr getRanges() const;
/**
* Get the value field.
* @return The PVScalarArray for the values.
*/
epics::pvData::PVScalarArrayPtr getValue() const;
/**
* Get the value field of a specified type (e.g. PVIntArray).
* @return The <PVT> field for the values.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const
{
return std::tr1::dynamic_pointer_cast<PVT>(pvValue);
}
private:
NTHistogram(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTHistogram;
epics::pvData::PVScalarArrayPtr pvValue;
friend class detail::NTHistogramBuilder;
};
}}
#endif /* NTHISTOGRAM_H */

View File

@@ -1,7 +1,7 @@
/* ntid.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <pv/ntid.h>

View File

@@ -1,7 +1,7 @@
/* ntid.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTID_H
#define NTID_H
@@ -13,110 +13,104 @@ namespace epics {
namespace nt {
/**
* @brief Utility class for parsing a type ID that follows the NT type ID conventions
* Utility class for parsing an ID following the NT type ID conventions
*
* An NT type ID will be of the from
@code
epics:nt/<type-name>:<Major>.<Minor>
@endcode
* e.g.
@code
epics:nt/NTNDArray:1.2
@endcode
* An NT type ID will be of the from epics:nt/<type-name>:<Major>.<Minor>,
* e.g. epics:nt/NTNDArray:1.2
* @author dgh
*/
class NTID
{
public:
/**
* Creates an NTID from the specified type ID.
* Creates an NTID from the specified type ID
*
* @param id the the ID to be parsed.
* @param id The the id to be parsed.
* @return NTNDArray instance on success, null otherwise.
*/
NTID(const std::string &id);
/**
* Returns the full name of the id, i.e. the original ID
* <p>
* For example above returns "epics:nt/NTNDArray:1.2".
* Get the full name of the id, i.e. the original ID
*
* For example above returns "epics:nt/NTNDArray:1.2"
* @return the full name
*/
std::string getFullName();
/**
* Returns the fully qualified name including namespaces, but excluding version numbers.
* <p>
* Get the fully qualified name including namespaces, but excluding version numbers
*
* For example above return "epics:nt/NTNDArray"
* @return the fully qualified name
*/
std::string getQualifiedName();
/**
* Returns the namespace
* <p>
* For example above return "epics:nt".
* Get the namespace
*
* For example above return "epics:nt"
* @return the namespace
*/
std::string getNamespace();
/**
* Returns the unqualified name, without namespace or version.
* <p>
* For example above return "NTNDArray".
* Get the unqualified name, without namespace or version
*
* For example above return "NTNDArray"
* @return the unqualified name
*/
std::string getName();
/**
* Returns the version as a string.
* <p>
* For example above return "NTNDArray".
* @return the the version string
* Get the unqualified name, without namespace or version
*
* For example above return "NTNDArray"
* @return the unqualified name
*/
std::string getVersion();
/**
* Returns the Major version as a string.
* <p>
* For example above return "1".
* Get the Major version as a string
*
* For example above return "1"
* @return the Major string
*/
std::string getMajorVersionString();
/**
* Does the ID contain a major version and is it a number.
* <p>
* Does the ID contain a major version and is it a number
*
* @return true if it contains a major version number
*/
bool hasMajorVersion();
/**
* Returns the Major version as an integer.
* <p>
* For example above return 1.
* Get the Major version as an integer
*
* For example above return 1
* @return the Major string
*/
int getMajorVersion();
/**
* Returns the Major version as a string.
* <p>
* For example above return "1".
* Get the Major version as a string
*
* For example above return "1"
* @return the Major string
*/
std::string getMinorVersionString();
/**
* Does the ID contain a minor version and is it a number.
* <p>
* Does the ID contain a minor version and is it a number
*
* @return true if it contains a minor version number
*/
bool hasMinorVersion();
/**
* Returns the Minor version as an integer.
* <p>
* For example above return 1.
* Get the Minor version as an integer
*
* For example above return 1
* @return the Minor string
*/
int getMinorVersion();

View File

@@ -1,7 +1,8 @@
/* ntmatrix.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -116,15 +117,15 @@ NTMatrixBuilder::shared_pointer NTMatrixBuilder::add(string const & name, FieldC
const std::string NTMatrix::URI("epics:nt/NTMatrix:1.0");
NTMatrix::shared_pointer NTMatrix::wrap(PVStructurePtr const & pvStructure)
NTMatrix::shared_pointer NTMatrix::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTMatrix::shared_pointer NTMatrix::wrapUnsafe(PVStructurePtr const & pvStructure)
NTMatrix::shared_pointer NTMatrix::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTMatrix(pvStructure));
return shared_pointer(new NTMatrix(structure));
}
bool NTMatrix::is_a(StructureConstPtr const & structure)
@@ -132,11 +133,6 @@ bool NTMatrix::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTMatrix::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTMatrix::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;

285
src/nt/ntmatrix.h Normal file
View File

@@ -0,0 +1,285 @@
/* ntmatrix.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTMATRIX_H
#define NTMATRIX_H
#ifdef epicsExportSharedSymbols
# define ntmatrixEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include <pv/pvDisplay.h>
#ifdef ntmatrixEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntmatrixEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTMatrix;
typedef std::tr1::shared_ptr<NTMatrix> NTMatrixPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTMatrix.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTMatrixBuilder :
public std::tr1::enable_shared_from_this<NTMatrixBuilder>
{
public:
POINTER_DEFINITIONS(NTMatrixBuilder);
/**
* Add dimensionfield to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDim();
/**
* Add descriptor field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Add display structure to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDisplay();
/**
* Create a <b>Structure</b> that represents NTMatrix.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTMatrix.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTMatrix</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTMatrix</b>.
*/
NTMatrixPtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTMatrixBuilder();
void reset();
bool dim;
bool descriptor;
bool alarm;
bool timeStamp;
bool display;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTMatrix;
};
}
typedef std::tr1::shared_ptr<detail::NTMatrixBuilder> NTMatrixBuilderPtr;
/**
* @brief Convenience Class for NTMatrix
*
* @author dgh
*/
class epicsShareClass NTMatrix
{
public:
POINTER_DEFINITIONS(NTMatrix);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTMatrix.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTMatrix.
* @return NTMatrix instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTMatrix without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTMatrix.
* @return NTMatrix instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTMatrix.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTMatrix.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTMatrix.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTMatrix.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTMatrix.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTMatrix.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTMatrix.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTMatrix.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTMatrix.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTMatrix
* @return (false,true) if (is not, is) a valid NTMatrix.
*/
bool isValid();
/**
* Create a NTMatrix builder instance.
* @return builder instance.
*/
static NTMatrixBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTMatrix() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Attach an pvDisplay.
* @param pvDisplay The pvDisplay that will be attached.
* Does nothing if no display.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
*/
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the display.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getDisplay() const;
/**
* Get the value field.
* @return The PVDoubleArray for the values.
*/
epics::pvData::PVDoubleArrayPtr getValue() const;
/**
* Get the dim field.
* @return The PVIntArray for the dim which may be null.
*/
epics::pvData::PVIntArrayPtr getDim() const;
private:
NTMatrix(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTMatrix;
epics::pvData::PVDoubleArrayPtr pvValue;
friend class detail::NTMatrixBuilder;
};
}}
#endif /* NTMATRIX_H */

View File

@@ -1,7 +1,8 @@
/* ntmultiChannel.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <algorithm>
@@ -209,15 +210,15 @@ NTMultiChannelBuilder::shared_pointer NTMultiChannelBuilder::add(string const &
const std::string NTMultiChannel::URI("epics:nt/NTMultiChannel:1.0");
NTMultiChannel::shared_pointer NTMultiChannel::wrap(PVStructurePtr const & pvStructure)
NTMultiChannel::shared_pointer NTMultiChannel::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTMultiChannel::shared_pointer NTMultiChannel::wrapUnsafe(PVStructurePtr const & pvStructure)
NTMultiChannel::shared_pointer NTMultiChannel::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTMultiChannel(pvStructure));
return shared_pointer(new NTMultiChannel(structure));
}
bool NTMultiChannel::is_a(StructureConstPtr const &structure)
@@ -225,10 +226,6 @@ bool NTMultiChannel::is_a(StructureConstPtr const &structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTMultiChannel::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTMultiChannel::isCompatible(StructureConstPtr const & structure)
{

View File

@@ -1,7 +1,8 @@
/* ntmultiChannel.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTMULTICHANNEL_H
#define NTMULTICHANNEL_H
@@ -53,96 +54,81 @@ namespace detail {
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer value(epics::pvData::UnionConstPtr valuePtr);
/**
* Adds descriptor field to the NTMultiChannel.
* Add descriptor field to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTMultiChannel.
* Add alarm structure to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTMultiChannel.
* Add timeStamp structure to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds severity array to the NTMultiChannel.
* Add severity array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addSeverity();
/**
* Adds status array to the NTMultiChannel.
* Add status array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addStatus();
/**
* Adds message array to the NTMultiChannel.
* Add message array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addMessage();
/**
* Adds secondsPastEpoch array to the NTMultiChannel.
* Add secondsPastEpoch array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addSecondsPastEpoch();
/**
* Adds nanoseconds array to the NTMultiChannel.
* Add nanoseconds array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addNanoseconds();
/**
* Adds userTag array to the NTMultiChannel.
* Add userTag array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addUserTag();
/**
* Adds isConnected array to the NTMultiChannel.
* Add isConnected array to the NTMultiChannel.
* @return this instance of <b>NTMultiChannelBuilder</b>.
*/
shared_pointer addIsConnected();
/**
* Creates a <b>Structure</b> that represents NTMultiChannel.
* Create a <b>Structure</b> that represents NTMultiChannel.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTMultiChannel.
* This resets this instance state and allows new instance to be created.
* Create a <b>PVStructure</b> that represents NTMultiChannel.
* This resets this instance state and allows new {@code instance to be created.}
* @return a new instance of a <b>PVStructure</b>
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTMultiChannel</b> instance.
* This resets this instance state and allows new instance to be created.
* Create a <b>NTMultiChannel</b> instance.
* This resets this instance state and allows new {@code instance to be created.}
* @return a new instance of a <b>NTMultiChannel</b>
*/
NTMultiChannelPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of a <b>NTMultiChannelBuilder</b>
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTMultiChannelBuilder();
@@ -186,92 +172,64 @@ public:
static const std::string URI;
/**
* Creates an NTMultiChannel wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTMultiChannel
* and if so returns an NTMultiChannel which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTMultiChannel instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTMultiChannel.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTMultiChannel.
* @return NTMultiChannel instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTMultiChannel wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTMultiChannel or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTMultiChannel instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTMultiChannel without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTMultiChannel.
* @return NTMultiChannel instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTMultiChannel.
* <p>
* Checks whether the specified Structure reports compatibility with this
* version of NTMultiChannel through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTMultiChannel
* Is the structure an NTMultiChannel.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTMultiChannel.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTMultiChannel.
* <p>
* Checks whether the specified PVStructure reports compatibility with this
* version of NTMultiChannel through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTMultiChannel
* Is the structure an NTMultiChannel.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTMultiChannel.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTMultiChannel.
* <p>
* Checks whether the specified Structure is compatible with this version
* of NTMultiChannel through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTMultiChannel
* Is the Structure compatible with NTMultiChannel.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTMultiChannel.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTMultiChannel.
* <p>
* Checks whether the specified PVStructure is compatible with this version
* of NTMultiChannel through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTMultiChannel
* Is the PVStructure compatible with NTMultiChannel.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTMultiChannel.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks whether the wrapped PVStructure is valid with respect to this
* version of NTMultiChannel.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTMultiChannel.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTMultiChannel
* Checks whether the wrapped structure is valid with respect to this
* version of NTMultiChannel
* @return (false,true) if (is not, is) a valid NTMultiChannel.
*/
bool isValid();
/**
* Creates an NTMultiChannelBuilder instance
* Create a NTMultiChannelBuilder instance
* @return builder instance.
*/
static NTMultiChannelBuilderPtr createBuilder();
@@ -280,113 +238,99 @@ public:
* Destructor
*/
~NTMultiChannel() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance
has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach a pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const
{return pvNTMultiChannel;}
/**
* Return the descriptor field.
* @return the descriptor field or null if no descriptor field.
*/
epics::pvData::PVStringPtr getDescriptor() const
{return pvDescriptor;}
/**
* Returns the timeStamp field.
* @return the timeStamp field or null if no such field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const
{return pvTimeStamp;}
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const
{return pvAlarm;}
/**
* Returns the field with the value of each channel.
* @return the value field.
* Get the value of each channel.
* @return PVUnionArrayPtr
*/
epics::pvData::PVUnionArrayPtr getValue() const
{return pvValue;}
/**
* Returns the field with the channelName of each channel.
* @return the channelName field
* Get the channelName of each channel.
* @return PVStringArrayPtr
*/
epics::pvData::PVStringArrayPtr getChannelName() const
{ return pvChannelName;};
/**
* Returns the field with the connection state of each channel.
* @return the isConnected field or null if no such field
* Get the connection state of each channel.
* @return PVBooleanArrayPtr
*/
epics::pvData::PVBooleanArrayPtr getIsConnected() const
{ return pvIsConnected;};
/**
* Returns the field with the severity of each channel.
* @return the severity field or null if no such field.
* Get the severity of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getSeverity() const
{return pvSeverity;}
/**
* Returns the field with the status of each channel.
* @return the status field or null if no such field
* Get the status of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getStatus() const
{return pvStatus;}
/**
* Returns the field with the message of each channel.
* @return message field or null if no such field.
* Get the message of each chnnel.
* @return PVStringArrayPtr which may be null.
*/
epics::pvData::PVStringArrayPtr getMessage() const
{return pvMessage;}
/**
* Returns the field with the secondsPastEpoch of each channel.
* @return the secondsPastEpoch field or null if no such field.
* Get the secondsPastEpoch of each channel.
* @return PVLongArrayPtr which may be null.
*/
epics::pvData::PVLongArrayPtr getSecondsPastEpoch() const
{return pvSecondsPastEpoch;}
/**
* Returns the field with the nanoseconds of each channel.
* @return nanoseconds field or null if no such field.
* Get the nanoseconds of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getNanoseconds() const
{return pvNanoseconds;}
/**
* Returns the field with the userTag of each channel.
* @return the userTag field or null if no such field.
* Get the userTag of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getUserTag() const
{return pvUserTag;}
/**
* Get the descriptor.
* @return PVStringPtr which may be null.
*/
epics::pvData::PVStringPtr getDescriptor() const
{return pvDescriptor;}
private:
NTMultiChannel(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTMultiChannel;

View File

@@ -1,7 +1,8 @@
/* ntnameValue.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -111,10 +112,10 @@ NTNameValueBuilder::shared_pointer NTNameValueBuilder::add(string const & name,
const std::string NTNameValue::URI("epics:nt/NTNameValue:1.0");
NTNameValue::shared_pointer NTNameValue::wrap(PVStructurePtr const & pvStructure)
NTNameValue::shared_pointer NTNameValue::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTNameValue::shared_pointer NTNameValue::wrapUnsafe(PVStructurePtr const & structure)
@@ -127,11 +128,6 @@ bool NTNameValue::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTNameValue::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTNameValue::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;

View File

@@ -1,7 +1,8 @@
/* ntnameValue.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTNAMEVALUE_H
#define NTNAMEVALUE_H
@@ -44,55 +45,55 @@ namespace detail {
POINTER_DEFINITIONS(NTNameValueBuilder);
/**
* Sets the value array <b>Scalar</b> type.
* @param scalarType the value field element ScalarType
* Set a value array <b>Scalar</b> type.
* @param scalarType value array scalar array.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType scalarType);
/**
* Adds descriptor field to the NTNameValue.
* Add descriptor field to the NTNameValue.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTNameValue.
* Add alarm structure to the NTNameValue.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTNameValue.
* Add timeStamp structure to the NTNameValue.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTNameValue.
* Create a <b>Structure</b> that represents NTNameValue.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTNameValue.
* Create a <b>PVStructure</b> that represents NTNameValue.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTNameValue</b> instance.
* Create a <b>NTNameValue</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTNameValue</b>
*/
NTNameValuePtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -133,90 +134,65 @@ public:
static const std::string URI;
/**
* Creates an NTNameValue wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTNameValue
* and if so returns an NTNameValue which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped.
* @return NTNameValue instance wrapping pvStructure on success, null otherwise.
* Wrap (aka dynamic cast, or wrap) the structure to NTNameValue.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNameValue.
* @return NTNameValue instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTNameValue wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTNameValue or is non-null.
*
* @param pvStructure the PVStructure to be wrapped.
* @return NTNameValue instance wrapping pvStructure.
* Wrap (aka dynamic cast, or wrap) the structure to NTNameValue without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNameValue.
* @return NTNameValue instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTNameValue.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTNameValue through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test.
* @return (false,true) if the specified Structure (is not, is) a compatible NTNameValue.
* Is the structure an NTNameValue.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTNameValue.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTNameValue.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTNameValue through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type
* Is the structure an NTNameValue.
* @param pvStructure The PVStructure to test.
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTNameValue.
* @return (false,true) if (is not, is) an NTNameValue.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTNameValue.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTNameValue through the introspection interface.
* @param structure the Structure to test.
* @return (false,true) if the specified Structure (is not, is) a compatible NTNameValue.
* Is the Structure compatible with NTNameValue.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTNameValue.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTNameValue.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTNameValue through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTNameValue
* Is the PVStructure compatible with NTNameValue.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTNameValue.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTNameValue.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTNameValue.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTNameValue
* Checks whether the wrapped structure is valid with respect to this
* version of NTNameValue
* @return (false,true) if (is not, is) a valid NTNameValue.
*/
bool isValid();
/**
* Creates an NTNameValue builder instance.
* Create a NTNameValue builder instance.
* @return builder instance.
*/
static NTNameValueBuilderPtr createBuilder();
@@ -227,63 +203,60 @@ public:
~NTNameValue() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no timeStamp field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the name array field.
* Get the name array field.
* @return The PVStringArray for the name.
*/
epics::pvData::PVStringArrayPtr getName() const;
/**
* Returns the value array field.
* Get the value array field.
* @return The PVField for the value.
*/
epics::pvData::PVFieldPtr getValue() const;
/**
* Returns the value array field of a specified expected type (e.g. PVDoubleArray).
*
* @tparam PVT The expected type of the value field which should be
* be PVScalarArray or a derived class.
* @return The PVT array for the value.
* Get the value array field of a specified type (e.g. PVDoubleArray).
* @return The <PVT> array for the value.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const

View File

@@ -1,13 +1,12 @@
/* ntndarray.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <algorithm>
#include <pv/lock.h>
#define epicsExportSharedSymbols
#include <pv/ntndarray.h>
#include <pv/ntndarrayAttribute.h>
@@ -281,15 +280,15 @@ public:
}
};
NTNDArray::shared_pointer NTNDArray::wrap(PVStructurePtr const & pvStructure)
NTNDArray::shared_pointer NTNDArray::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTNDArray::shared_pointer NTNDArray::wrapUnsafe(PVStructurePtr const & pvStructure)
NTNDArray::shared_pointer NTNDArray::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTNDArray(pvStructure));
return shared_pointer(new NTNDArray(structure));
}
bool NTNDArray::is_a(StructureConstPtr const & structure)
@@ -297,11 +296,6 @@ bool NTNDArray::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTNDArray::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTNDArray::isCompatible(StructureConstPtr const &structure)
{
if(!structure.get()) return false;
@@ -352,10 +346,10 @@ bool NTNDArray::isCompatible(StructureConstPtr const &structure)
StructureArrayConstPtr attributeField = structure->getField<StructureArray>( "attribute");
if (!attributeField)
return false;
if (!NTNDArrayAttribute::isCompatible(attributeField->getStructure()))
StructureConstPtr attributeElementStruc = attributeField->getStructure();
if (!NTNDArrayAttribute::isCompatible(attributeElementStruc))
return false;
@@ -363,7 +357,7 @@ bool NTNDArray::isCompatible(StructureConstPtr const &structure)
if (field.get())
{
ScalarConstPtr descriptorField = structure->getField<Scalar>("descriptor");
if (!descriptorField || descriptorField->getScalarType() != pvString)
if (!descriptorField.get() || descriptorField->getScalarType() != pvString)
return false;
}
@@ -512,15 +506,6 @@ bool NTNDArray::attachAlarm(PVAlarm &pvAlarm) const
return false;
}
bool NTNDArray::attachDisplay(PVDisplay &pvDisplay) const
{
PVStructurePtr dp = getDisplay();
if (dp)
return pvDisplay.attach(dp);
else
return false;
}
PVStructurePtr NTNDArray::getPVStructure() const
{
return pvNTNDArray;

View File

@@ -1,7 +1,8 @@
/* ntndarray.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTNDARRAY_H
#define NTNDARRAY_H
@@ -47,54 +48,53 @@ namespace detail {
POINTER_DEFINITIONS(NTNDArrayBuilder);
/**
* Adds descriptor field to the NTNDArray.
* Add descriptor field to the NTNDArray.
* @return this instance of <b>NTNDArrayBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTNDArray.
* Add alarm structure to the NTNDArray.
* @return this instance of <b>NTNDArrayBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTNDArray.
* Add timeStamp structure to the NTNDArray.
* @return this instance of <b>NTNDArrayBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds display field to the NTNDArray.
* Add display structure to the NTNDArray.
* @return this instance of <b>NTNDArrayBuilder</b>.
*/
shared_pointer addDisplay();
/**
* Creates a <b>Structure</b> that represents NTNDArray.
* Create a <b>Structure</b> that represents NTNDArray.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTNDArray.
* Create a <b>PVStructure</b> that represents NTNDArray.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTNDArray</b> instance.
* Create a <b>NTNDArray</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTNDArray</b>
*/
NTNDArrayPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of a <b>NTArrayBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -133,91 +133,65 @@ public:
static const std::string URI;
/**
* Creates an NTScalarArray wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTScalarArray
* and if so returns an NTScalarArray which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalarArray instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTNDArray.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNDArray.
* @return NTNDArray instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTNDArray wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTNDArray or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTNDArray instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTNDArray without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNDArray.
* @return NTNDArray instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTNDArray.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTNDArray through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the pvStructure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTNDArray
* Is the structure an NTNDArray.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTNDArray.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTNDArray.
*
* Checks if the specified PVStructure reports compatibility with this
* version of NTNDArray through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTNDArray
* Is the structure an NTNDArray.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTNDArray.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTNDArray.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTNDArray through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTNDArray
* Is the Structure compatible with NTNDArray.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTNDArray.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTNDArray.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTNDArray through the introspection interface.
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTNDArray
* Is the PVStructure compatible with NTNDArray.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTNDArray.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTNDArray.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTNDArray.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTNDArray
* Checks whether the wrapped structure is valid with respect to this
* version of NTNDArray
* @return (false,true) if (is not, is) a valid NTNDArray.
*/
bool isValid();
/**
* Creates an NTNDArrayBuilder instance
* Create a NTNDArrayBuilder instance
* @return builder instance.
*/
static NTNDArrayBuilderPtr createBuilder();
@@ -228,15 +202,15 @@ public:
~NTNDArray() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp to timeStamp field.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a pvTimeStamp to dataTimeStamp field.
* Attach a pvTimeStamp to dataTimeStamp field.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
@@ -244,96 +218,88 @@ public:
bool attachDataTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the value field.
* Returns the value field.
* Get the value field.
* @return The PVField for the values.
*/
epics::pvData::PVUnionPtr getValue() const;
/**
* Returns the codec field.
* @return the codec field.
* Get the codec field.
* @return the PVStructurePtr.
*/
epics::pvData::PVStructurePtr getCodec() const;
/**
* Returns the compressedDataSize field.
* @return the compressedDataSize field.
* Get the compressedDataSize field.
* @return PVStructurePtr.
*/
epics::pvData::PVLongPtr getCompressedDataSize() const;
/**
* Returns the uncompressedDataSize field.
* @return the uncompressedDataSize field.
* Get the uncompressedDataSize field.
* @return PVStructurePtr.
*/
epics::pvData::PVLongPtr getUncompressedDataSize() const;
/**
* Returns the dimension field.
* @return the dimension field.
* Get the dimension field.
* @return the PVStructurePtr.
*/
epics::pvData::PVStructureArrayPtr getDimension() const;
/**
* Returns the uniqueId field.
* @return the uniqueId field.
* Get the uniqueId field.
* @return PVStructurePtr.
*/
epics::pvData::PVIntPtr getUniqueId() const;
/**
* Returns the dataTimeStamp field.
* @return the dataTimeStamp field.
* Get the data timeStamp field.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getDataTimeStamp() const;
/**
* Returns the attribute field.
* @return the attribute field.
* Get the attribute field.
* @return the PVStructurePtr.
*/
epics::pvData::PVStructureArrayPtr getAttribute() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no timeStamp field.
* Get the timeStamp field.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
* Get the alarm field.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Attaches a PVDisplay to the wrapped PVStructure.
* Does nothing if no display.
* @param pvDisplay the PVDisplay that will be attached.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
*/
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const;
/**
* Returns the display field.
* @return PVStructurePtr or null if no alarm field.
* Get the display field.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getDisplay() const;

View File

@@ -1,7 +1,8 @@
/* ntndarrayAttribute.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -93,7 +94,6 @@ NTNDArrayAttributeBuilder::NTNDArrayAttributeBuilder()
void NTNDArrayAttributeBuilder::reset()
{
tags = false;
descriptor = false;
alarm = false;
timeStamp = false;
@@ -111,15 +111,15 @@ NTNDArrayAttributeBuilder::shared_pointer NTNDArrayAttributeBuilder::add(string
const std::string NTNDArrayAttribute::URI("epics:nt/NTAttribute:1.0");
NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrap(PVStructurePtr const & pvStructure)
NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrapUnsafe(PVStructurePtr const & pvStructure)
NTNDArrayAttribute::shared_pointer NTNDArrayAttribute::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTNDArrayAttribute(pvStructure));
return shared_pointer(new NTNDArrayAttribute(structure));
}
bool NTNDArrayAttribute::is_a(StructureConstPtr const & structure)
@@ -127,11 +127,6 @@ bool NTNDArrayAttribute::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTNDArrayAttribute::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTNDArrayAttribute::isCompatible(StructureConstPtr const & structure)
{
if (!NTAttribute::isCompatible(structure)) return false;

279
src/nt/ntndarrayAttribute.h Normal file
View File

@@ -0,0 +1,279 @@
/* ntndarrayAttribute.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTNDARRAYATTRIBUTE_H
#define NTNDARRAYATTRIBUTE_H
#ifdef epicsExportSharedSymbols
# define ntndarrayAttributeEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntndarrayAttributeEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntndarrayAttributeEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTNDArrayAttribute;
typedef std::tr1::shared_ptr<NTNDArrayAttribute> NTNDArrayAttributePtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTAttribute extended as required by NTNDArray
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTNDArrayAttributeBuilder :
public std::tr1::enable_shared_from_this<NTNDArrayAttributeBuilder>
{
public:
POINTER_DEFINITIONS(NTNDArrayAttributeBuilder);
/**
* Add tags field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
virtual shared_pointer addTags();
/**
* Add descriptor field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Create a <b>Structure</b> that represents NTNDArrayAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTNDArrayAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTNDArrayAttribute</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTNDArrayAttribute</b>.
*/
NTNDArrayAttributePtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
protected://private:
NTNDArrayAttributeBuilder();
void reset();
bool tags;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTNDArrayAttribute;
};
}
typedef std::tr1::shared_ptr<detail::NTNDArrayAttributeBuilder> NTNDArrayAttributeBuilderPtr;
/**
* @briVIntPtref Convenience Class for NTNDArrayAttribute
*
* @author dgh
*/
class epicsShareClass NTNDArrayAttribute
{
public:
POINTER_DEFINITIONS(NTNDArrayAttribute);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTNDArrayAttribute.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNDArrayAttribute.
* @return NTNDArrayAttribute instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTNDArrayAttribute without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTNDArrayAttribute.
* @return NTNDArrayAttribute instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTNDArrayAttribute.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTNDArrayAttribute.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTNDArrayAttribute.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTNDArrayAttribute.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTNDArrayAttribute.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTNDArrayAttribute.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTNDArrayAttribute.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTNDArrayAttribute.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTNDArrayAttribute.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTNDArrayAttribute
* @return (false,true) if (is not, is) a valid NTNDArrayAttribute.
*/
bool isValid();
/**
* Create a NTNDArrayAttribute builder instance.
* @return builder instance.
*/
static NTNDArrayAttributeBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTNDArrayAttribute() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the name field.
* @return The PVString for the name.
*/
epics::pvData::PVStringPtr getName() const;
/**
* Get the value field.
* @return The PVUnion for the values.
*/
epics::pvData::PVUnionPtr getValue() const;
/**
* Get the tags field.
* @return The PVStringArray for the tags, which may be null.
*/
epics::pvData::PVStringArrayPtr getTags() const;
/**
* Get the sourceType field.
* @return The PVInt for the sourceType field.
*/
epics::pvData::PVIntPtr getSourceType() const;
/**
* Get the source field.
* @return The PVString for the source field, which may be null.
*/
epics::pvData::PVStringPtr getSource() const;
private:
NTNDArrayAttribute(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTNDArrayAttribute;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTNDArrayAttributeBuilder;
};
}}
#endif /* NTNDARRAYATTRIBUTE_H */

View File

@@ -1,7 +1,8 @@
/* ntscalar.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -129,15 +130,15 @@ NTScalarBuilder::shared_pointer NTScalarBuilder::add(string const & name, FieldC
const std::string NTScalar::URI("epics:nt/NTScalar:1.0");
NTScalar::shared_pointer NTScalar::wrap(PVStructurePtr const & pvStructure)
NTScalar::shared_pointer NTScalar::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTScalar::shared_pointer NTScalar::wrapUnsafe(PVStructurePtr const & pvStructure)
NTScalar::shared_pointer NTScalar::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTScalar(pvStructure));
return shared_pointer(new NTScalar(structure));
}
bool NTScalar::is_a(StructureConstPtr const & structure)
@@ -145,11 +146,6 @@ bool NTScalar::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTScalar::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTScalar::isCompatible(StructureConstPtr const &structure)
{
if (structure.get() == 0) return false;

View File

@@ -1,7 +1,8 @@
/* ntscalar.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTSCALAR_H
#define NTSCALAR_H
@@ -44,67 +45,66 @@ namespace detail {
POINTER_DEFINITIONS(NTScalarBuilder);
/**
* Sets the value type of an NTScalar.
* Set a value type of a NTScalar.
* @param scalarType the value type.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType scalarType);
/**
* Adds descriptor field to the NTScalar.
* Add descriptor field to the NTScalar.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTScalar.
* Add alarm structure to the NTScalar.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTScalar.
* Add timeStamp structure to the NTScalar.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds display field to the NTScalar.
* Add display structure to the NTScalar.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer addDisplay();
/**
* Adds control field to the NTScalar.
* Add control structure to the NTScalar.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer addControl();
/**
* Creates a <b>Structure</b> that represents NTScalar.
* Create a <b>Structure</b> that represents NTScalar.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTScalar.
* Create a <b>PVStructure</b> that represents NTScalar.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTScalar</b> instance.
* Create a <b>NTScalar</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTScalar</b>.
*/
NTScalarPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTScalarBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -149,92 +149,65 @@ public:
static const std::string URI;
/**
* Creates an NTScalar wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTScalar
* and if so returns an NTScalar which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalar instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTScalar.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalar.
* @return NTScalar instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTScalar wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTScalar or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalar instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTMultiChannel without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalar.
* @return NTScalar instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTScalar.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTScalar through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalar
* Is the structure an NTScalar.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTScalar.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTScalar.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTScalar through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTScalar
* Is the structure an NTScalar.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalar.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTScalar.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTScalar through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalar
* Is the Structure compatible with NTScalar.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTScalar.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTScalar.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTScalar through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTScalar
* Is the PVStructure compatible with NTScalar.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalar.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTScalar.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTScalar.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTScalar
* Checks whether the wrapped structure is valid with respect to this
* version of NTScalar
* @return (false,true) if (is not, is) a valid NTScalar.
*/
bool isValid();
/**
* Creates an NTScalar builder instance.
* Create a NTScalar builder instance.
* @return builder instance.
*/
static NTScalarBuilderPtr createBuilder();
@@ -245,84 +218,82 @@ public:
~NTScalar() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Attaches a PVDisplay to the wrapped PVStructure.
* Does nothing if no display field.
* @param pvDisplay the PVDisplay that will be attached.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
* Attach an pvDisplay.
* @param pvDisplay The pvDisplay that will be attached.
* Does nothing if no display.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
*/
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const;
/**
* Attaches an PVControl to the wrapped PVStructure.
* Does nothing if no control field.
* @param pvControl The PVControl that will be attached.
* @return true if the operation was successfull (i.e. this instance has a control field), otherwise false.
* Attach an pvControl.
* @param pvControl The pvControl that will be attached.
* Does nothing if no control.
* @return true if the operation was successfull (i.e. this instance has a control field), otherwise false.
*/
bool attachControl(epics::pvData::PVControl &pvControl) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no timeStamp field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the display.
* Get the display.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getDisplay() const;
/**
* Returns the control.
* Get the control.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getControl() const;
/**
* Returns the value field.
* Get the value field.
* @return The PVField for the values.
*/
epics::pvData::PVFieldPtr getValue() const;
/**
* Returns the value field of a specified type (for example, PVDouble).
* @tparam PVT the expected type of the value field which should be
* be PVScalar or a derived class.
* @return the value field or null if it is not of the expected type.
* Get the value field of a specified type (e.g. PVDouble).
* @return The <PVT> field for the values.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const

View File

@@ -1,7 +1,8 @@
/* ntscalarArray.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -17,16 +18,6 @@ static NTFieldPtr ntField = NTField::get();
namespace detail {
NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::value(
epics::pvData::ScalarType elementType
)
{
valueType = elementType;
valueTypeSet = true;
return shared_from_this();
}
NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::arrayValue(
epics::pvData::ScalarType elementType
)
@@ -138,15 +129,15 @@ NTScalarArrayBuilder::shared_pointer NTScalarArrayBuilder::add(string const & na
const std::string NTScalarArray::URI("epics:nt/NTScalarArray:1.0");
NTScalarArray::shared_pointer NTScalarArray::wrap(PVStructurePtr const & pvStructure)
NTScalarArray::shared_pointer NTScalarArray::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTScalarArray::shared_pointer NTScalarArray::wrapUnsafe(PVStructurePtr const & pvStructure)
NTScalarArray::shared_pointer NTScalarArray::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTScalarArray(pvStructure));
return shared_pointer(new NTScalarArray(structure));
}
bool NTScalarArray::is_a(StructureConstPtr const & structure)
@@ -154,11 +145,6 @@ bool NTScalarArray::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTScalarArray::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTScalarArray::isCompatible(StructureConstPtr const & structure)
{
if (structure.get() == 0) return false;

View File

@@ -1,7 +1,8 @@
/* ntscalarArray.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTSCALARARRAY_H
#define NTSCALARARRAY_H
@@ -45,75 +46,66 @@ namespace detail {
POINTER_DEFINITIONS(NTScalarArrayBuilder);
/**
* Sets the value type of the NTScalarArray.
* @param elementType the value field element ScalarType.
* Set a value type of a NTScalarArray.
* @param elementType the value array element type.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType elementType);
/**
* Sets the value type of the NTScalarArray.
* @param elementType the value field element ScalarType.
* @return this instance of <b>NTScalarArrayBuilder</b>.
* @deprecated use value instead.
*/
shared_pointer arrayValue(epics::pvData::ScalarType elementType);
/**
* Adds descriptor field to the NTScalarArray.
* Add descriptor field to the NTScalarArray.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTScalarArray.
* Add alarm structure to the NTScalarArray.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTScalarArray.
* Add timeStamp structure to the NTScalarArray.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds display field to the NTScalarArray.
* Add display structure to the NTScalarArray.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer addDisplay();
/**
* Adds control field to the NTScalarArray.
* Add control structure to the NTScalarArray.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer addControl();
/**
* Creates a <b>Structure</b> that represents NTScalarArray.
* Create a <b>Structure</b> that represents NTScalarArray.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTScalarArray.
* Create a <b>PVStructure</b> that represents NTScalarArray.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTScalarArray</b> instance.
* Create a <b>NTScalarArray</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTScalarArray</b>.
*/
NTScalarArrayPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTScalarArrayBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -158,91 +150,65 @@ public:
static const std::string URI;
/**
* Creates an NTScalarArray wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTScalarArray
* and if so returns an NTScalarArray which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalarArray instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTScalarArray.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalarArray.
* @return NTScalarArray instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTScalarArray wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTScalarArray or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalarArray instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTMatrix without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalarArray.
* @return NTScalarArray instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTScalarArray.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTScalarArray through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalarArray
* Is the structure an NTScalarArray.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTScalarArray.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTScalarArray.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTScalarArray through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTScalarArray
* Is the structure an NTScalarArray.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalarArray.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTScalarArray.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTScalarArray through the introspection interface.
*
* @param structure the Structure to test.
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalarArray
* Is the Structure compatible with NTScalarArray.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTScalarArray.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTScalarArray.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTScalarArray through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTScalarArray
* Is the PVStructure compatible with NTScalarArray.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalarArray.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is a valid NTScalarArray.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTScalarArray.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTScalarArray.
* Checks whether the wrapped structure is valid with respect to this
* version of NTScalarArray
* @return (false,true) if (is not, is) a valid NTScalarArray.
*/
bool isValid();
/**
* Creates an NTScalarArray builder instance.
* Create a NTScalarArray builder instance.
* @return builder instance.
*/
static NTScalarArrayBuilderPtr createBuilder();
@@ -253,84 +219,82 @@ public:
~NTScalarArray() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Attaches a PVDisplay to the wrapped PVStructure.
* Does nothing if no display field.
* @param pvDisplay the PVDisplay that will be attached.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
* Attach an pvDisplay.
* @param pvDisplay The pvDisplay that will be attached.
* Does nothing if no display.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
*/
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const;
/**
* Attaches an pvControl.
* Attach an pvControl.
* @param pvControl The pvControl that will be attached.
* Does nothing if no control field.
* Does nothing if no control.
* @return true if the operation was successfull (i.e. this instance has a control field), otherwise false.
*/
bool attachControl(epics::pvData::PVControl &pvControl) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no timeStamp field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the display.
* Get the display.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getDisplay() const;
/**
* Returns the control.
* Get the control.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getControl() const;
/**
* Returns the value field.
* Get the value field.
* @return The PVField for the values.
*/
epics::pvData::PVFieldPtr getValue() const;
/**
* Returns the value field of a specified type (e.g. PVDoubleArray).
* @tparam PVT the expected type of the value field which should be
* be PVScalarArray or a derived class.
* @return the value field or null if it is not of the expected type.
* Get the value field of a specified type (e.g. PVDoubleArray).
* @return The <PVT> field for the values.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const

View File

@@ -1,8 +1,10 @@
/* ntscalarMultiChannel.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <algorithm>
#define epicsExportSharedSymbols
@@ -205,15 +207,15 @@ NTScalarMultiChannelBuilder::shared_pointer NTScalarMultiChannelBuilder::add(str
const std::string NTScalarMultiChannel::URI("epics:nt/NTScalarMultiChannel:1.0");
NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrap(PVStructurePtr const & pvStructure)
NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrapUnsafe(PVStructurePtr const & pvStructure)
NTScalarMultiChannel::shared_pointer NTScalarMultiChannel::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTScalarMultiChannel(pvStructure));
return shared_pointer(new NTScalarMultiChannel(structure));
}
bool NTScalarMultiChannel::is_a(StructureConstPtr const &structure)
@@ -221,10 +223,6 @@ bool NTScalarMultiChannel::is_a(StructureConstPtr const &structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTScalarMultiChannel::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTScalarMultiChannel::isCompatible(StructureConstPtr const & structure)
{

View File

@@ -1,7 +1,8 @@
/* ntscalarMultiChannel.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTSCALARMULTICHANNEL_H
#define NTSCALARMULTICHANNEL_H
@@ -48,104 +49,87 @@ namespace detail {
{
public:
POINTER_DEFINITIONS(NTScalarMultiChannelBuilder);
/**
* Sets the scalar type for the value field.
* specify the scalar type for the value field.
* If this is not called then pvDouble is the default.
* @param scalarType the value field element ScalarType.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType scalarType);
/**
* Adds descriptor field to the NTScalarMultiChannel.
* Add descriptor field to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTScalarMultiChannel.
* Add alarm structure to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTScalarMultiChannel.
* Add timeStamp structure to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds severity array to the NTScalarMultiChannel.
* Add severity array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addSeverity();
/**
* Adds status array to the NTScalarMultiChannel.
* Add status array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addStatus();
/**
* Adds message array to the NTScalarMultiChannel.
* Add message array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addMessage();
/**
* Adds secondsPastEpoch array to the NTScalarMultiChannel.
* Add secondsPastEpoch array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addSecondsPastEpoch();
/**
* Adds nanoseconds array to the NTScalarMultiChannel.
* Add nanoseconds array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addNanoseconds();
/**
* Adds userTag array to the NTScalarMultiChannel.
* Add userTag array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addUserTag();
/**
* Adds isConnected array to the NTScalarMultiChannel.
* Add isConnected array to the NTScalarMultiChannel.
* @return this instance of <b>NTScalarMultiChannelBuilder</b>.
*/
shared_pointer addIsConnected();
/**
* Creates a <b>Structure</b> that represents NTScalarMultiChannel.
* Create a <b>Structure</b> that represents NTScalarMultiChannel.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTScalarMultiChannel.
* This resets this instance state and allows new instance to be created.
* Create a <b>PVStructure</b> that represents NTScalarMultiChannel.
* This resets this instance state and allows new {@code instance to be created.}
* @return a new instance of a <b>PVStructure</b>
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTScalarMultiChannel</b> instance.
* This resets this instance state and allows new instance to be created.
* Create a <b>NTScalarMultiChannel</b> instance.
* This resets this instance state and allows new {@code instance to be created.}
* @return a new instance of a <b>NTScalarMultiChannel</b>
*/
NTScalarMultiChannelPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of a <b>NTScalarMultiChannelBuilder</b>
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTScalarMultiChannelBuilder();
@@ -189,90 +173,64 @@ public:
static const std::string URI;
/**
* Creates an NTScalarMultiChannel wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTScalarMultiChannel
* and if so returns an NTScalarMultiChannel which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalarMultiChannel instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTScalarMultiChannel.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalarMultiChannel.
* @return NTScalarMultiChannel instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTScalarMultiChannel wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTScalarMultiChannel or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalarMultiChannel instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTScalarMultiChannel without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTScalarMultiChannel.
* @return NTScalarMultiChannel instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTScalarMultiChannel.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTScalarMultiChannel through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalarMultiChannel
* Is the structure an NTScalarMultiChannel.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTScalarMultiChannel.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTScalarMultiChannel.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTScalarMultiChannel through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTScalarMultiChannel
* Is the structure an NTScalarMultiChannel.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalarMultiChannel.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTScalarMultiChannel.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTScalarMultiChannel through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTScalarMultiChannel
* Is the Structure compatible with NTScalarMultiChannel.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTScalarMultiChannel.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the wrapped PVStructure is a valid NTScalarMultiChannel.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTScalarMultiChannel
* Is the PVStructure compatible with NTScalarMultiChannel.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTScalarMultiChannel.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the specified PVStructure is a valid NTScalarMultiChannel.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTScalarMultiChannel.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTScalarMultiChannel.
* Checks whether the wrapped structure is valid with respect to this
* version of NTScalarMultiChannel
* @return (false,true) if (is not, is) a valid NTScalarMultiChannel.
*/
bool isValid();
/**
* Creates an NTScalarMultiChannelBuilder instance
* Create a NTScalarMultiChannelBuilder instance
* @return builder instance.
*/
static NTScalarMultiChannelBuilderPtr createBuilder();
@@ -281,126 +239,107 @@ public:
* Destructor
*/
~NTScalarMultiChannel() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach a pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const
{return pvNTScalarMultiChannel;}
/**
* Return the descriptor field.
* @return the descriptor field or null if no descriptor field.
*/
epics::pvData::PVStringPtr getDescriptor() const
{return pvDescriptor;}
/**
* Returns the timeStamp field.
* @return the timeStamp field or null if no such field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const
{return pvTimeStamp;}
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const
{return pvAlarm;}
/**
* Returns the field with the value of each channel.
* @return the value field.
* Get the value of each channel.
* @return PVScalarArrayPtr
*/
epics::pvData::PVScalarArrayPtr getValue() const
{return pvValue;}
/**
* Returns the value of each channel of a specified expected type
* (for example, PVDoubleArray).
* @tparam PVT the expected type of the value field which should be
* be PVScalarArray or a derived class.
* @return the value field or null if it is not of the expected type.
* Get the value field of a specified type (e.g. PVDoubleArray).
* @return The <PVT> field for the values.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const
{
return std::tr1::dynamic_pointer_cast<PVT>(pvValue);
}
/**
* Returns the field with the channelName of each channel.
* @return the channelName field
* Get the channelName of each channel.
* @return PVStringArrayPtr
*/
epics::pvData::PVStringArrayPtr getChannelName() const
{ return pvChannelName;};
/**
* Returns the field with the connection state of each channel.
* @return the isConnected field or null if no such field
* Get the connection state of each channel.
* @return PVBooleanArrayPtr
*/
epics::pvData::PVBooleanArrayPtr getIsConnected() const
{ return pvIsConnected;};
/**
* Returns the field with the severity of each channel.
* @return the severity field or null if no such field
* Get the severity of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getSeverity() const
{return pvSeverity;}
/**
* Returns the field with the status of each channel.
* @return the status field or null if no such field
* Get the status of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getStatus() const
{return pvStatus;}
/**
* Returns the field with the message of each channel.
* @return message field or null if no such field.
* Get the message of each chnnel.
* @return PVStringArrayPtr which may be null.
*/
epics::pvData::PVStringArrayPtr getMessage() const
{return pvMessage;}
/**
* Returns the field with the secondsPastEpoch of each channel.
* @return the secondsPastEpoch field or null if no such field.
* Get the secondsPastEpoch of each channel.
* @return PVLongArrayPtr which may be null.
*/
epics::pvData::PVLongArrayPtr getSecondsPastEpoch() const
{return pvSecondsPastEpoch;}
/**
* Returns the field with the nanoseconds of each channel.
* @return nanoseconds field or null if no such field.
* Get the nanoseconds of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getNanoseconds() const
{return pvNanoseconds;}
/**
* Returns the field with the userTag of each channel.
* @return the userTag field or null if no such field.
* Get the userTag of each channel.
* @return PVIntArrayPtr which may be null.
*/
epics::pvData::PVIntArrayPtr getUserTag() const
{return pvUserTag;}
/**
* Get the descriptor.
* @return PVStringPtr which may be null.
*/
epics::pvData::PVStringPtr getDescriptor() const
{return pvDescriptor;}
private:
NTScalarMultiChannel(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTScalarMultiChannel;

View File

@@ -1,7 +1,8 @@
/* nttable.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <algorithm>
@@ -126,15 +127,15 @@ NTTableBuilder::shared_pointer NTTableBuilder::add(string const & name, FieldCon
const std::string NTTable::URI("epics:nt/NTTable:1.0");
NTTable::shared_pointer NTTable::wrap(PVStructurePtr const & pvStructure)
NTTable::shared_pointer NTTable::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTTable::shared_pointer NTTable::wrapUnsafe(PVStructurePtr const & pvStructure)
NTTable::shared_pointer NTTable::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTTable(pvStructure));
return shared_pointer(new NTTable(structure));
}
bool NTTable::is_a(StructureConstPtr const & structure)
@@ -142,11 +143,6 @@ bool NTTable::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTTable::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTTable::isCompatible(StructureConstPtr const & structure)
{
if (!structure.get()) return false;
@@ -270,7 +266,7 @@ PVStringArrayPtr NTTable::getLabels() const
StringArray const & NTTable::getColumnNames() const
{
return pvValue->getStructure()->getFieldNames();
return pvNTTable->getStructure()->getFieldNames();
}
PVFieldPtr NTTable::getColumn(std::string const & columnName) const

View File

@@ -1,7 +1,8 @@
/* nttable.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTTABLE_H
#define NTTABLE_H
@@ -47,7 +48,7 @@ namespace detail {
POINTER_DEFINITIONS(NTTableBuilder);
/**
* Adds a column of given <b>Scalar</b> type.
* Add a column of given <b>Scalar</b> type.
* @param name name of the column.
* @param elementType column type, a scalar array.
* @return this instance of <b>NTTableBuilder</b>.
@@ -55,32 +56,32 @@ namespace detail {
shared_pointer addColumn(std::string const & name, epics::pvData::ScalarType elementType);
/**
* Adds descriptor field to the NTTable.
* Add descriptor field to the NTTable.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTTable.
* Add alarm structure to the NTTable.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTTable.
* Add timeStamp structure to the NTTable.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTTable.
* Create a <b>Structure</b> that represents NTTable.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTTable.
* Create a <b>PVStructure</b> that represents NTTable.
* The returned PVStructure will have labels equal to the column names.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
@@ -88,18 +89,17 @@ namespace detail {
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTTable</b> instance.
* Create a <b>NTTable</b> instance.
* The returned NTTable will wrap a PVStructure which will have
* labels equal to the column names.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTTable</b>.
*/
NTTablePtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTTableBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -142,91 +142,65 @@ public:
static const std::string URI;
/**
* Creates an NTTable wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTTable
* and if so returns an NTTable which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTTable instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTTable.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTTable.
* @return NTTable instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTTable wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTTable or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTTable instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTMultiChannel without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTTable.
* @return NTTable instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTTable.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTTable through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTTable
* Is the structure an NTTable.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTTable.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTTable.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTTable through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTTable
* Is the structure an NTTable.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTTable.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTTable.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTTable through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTTable
* Is the Structure compatible with NTTable.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTTable.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTTable.
*
* Checks if the specified PVStructure is compatible with this version
* of NTTable through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTTable
* Is the PVStructure compatible with NTTable.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTTable.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the specified structure is a valid NTTable.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTTable.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTTable
* Checks whether the wrapped structure is valid with respect to this
* version of NTTable
* @return (false,true) if (is not, is) a valid NTTable.
*/
bool isValid();
/**
* Creates an NTTable builder instance.
* Create a NTTable builder instance.
* @return builder instance.
*/
static NTTableBuilderPtr createBuilder();
@@ -237,73 +211,69 @@ public:
~NTTable() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the labels field.
* @return the labels field.
* Get the labels field.
* @return The pvStringArray for the labels.
*/
epics::pvData::PVStringArrayPtr getLabels() const;
/**
* Returns the column names for the table.
* Get the column names for the table.
* For each name, calling getColumn should return the column, which should not be null.
* @return the column names.
* @return The column names.
*/
epics::pvData::StringArray const & getColumnNames() const;
/**
* Returns the PVField for the column with the specified colum name.
* @param columnName the name of the column.
* @return the field for the column or null if column does not exist.
* Get the PVField (column) for a field that follows the label field.
* @param columnName The name of the column.
* @return The PVFieldPtr for the field.
*/
epics::pvData::PVFieldPtr getColumn(std::string const & columnName) const;
/**
* Returns the column with the specified column name and of a specified
* expected type (for example, PVDoubleArray).
* @tparam PVT the expected type of the column which should be
* be PVScalarArray or a derived class.
* @param columnName the name of the column.
* @return the field for the column or null if column does not exist
* or is not of the specified type.
* Get the PVField (column) for a field that follows the label field of a specified type (e.g. PVDoubleArray).
* @param columnName The name of the column.
* @return The <PVT> field.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getColumn(std::string const & columnName) const

View File

@@ -1,7 +1,8 @@
/* ntunion.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols
@@ -18,12 +19,6 @@ static NTFieldPtr ntField = NTField::get();
namespace detail {
NTUnionBuilder::shared_pointer NTUnionBuilder::value(UnionConstPtr unionType)
{
valueType = unionType;
return shared_from_this();
}
StructureConstPtr NTUnionBuilder::createStructure()
{
FieldBuilderPtr builder =
@@ -105,15 +100,15 @@ NTUnionBuilder::shared_pointer NTUnionBuilder::add(string const & name, FieldCon
const std::string NTUnion::URI("epics:nt/NTUnion:1.0");
NTUnion::shared_pointer NTUnion::wrap(PVStructurePtr const & pvStructure)
NTUnion::shared_pointer NTUnion::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTUnion::shared_pointer NTUnion::wrapUnsafe(PVStructurePtr const & pvStructure)
NTUnion::shared_pointer NTUnion::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTUnion(pvStructure));
return shared_pointer(new NTUnion(structure));
}
bool NTUnion::is_a(StructureConstPtr const & structure)
@@ -121,11 +116,6 @@ bool NTUnion::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTUnion::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTUnion::isCompatible(StructureConstPtr const &structure)
{
if (structure.get() == 0) return false;

250
src/nt/ntunion.h Normal file
View File

@@ -0,0 +1,250 @@
/* ntunion.h */
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTUNION_H
#define NTUNION_H
#ifdef epicsExportSharedSymbols
# define ntunionEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntunionEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntunionEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTUnion;
typedef std::tr1::shared_ptr<NTUnion> NTUnionPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTUnion.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTUnionBuilder :
public std::tr1::enable_shared_from_this<NTUnionBuilder>
{
public:
POINTER_DEFINITIONS(NTUnionBuilder);
/**
* Add descriptor field to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Add alarm structure to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Add timeStamp structure to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Create a <b>Structure</b> that represents NTUnion.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Create a <b>PVStructure</b> that represents NTUnion.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Create a <b>NTUnion</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTUnion</b>.
*/
NTUnionPtr create();
/**
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTUnionBuilder();
epics::pvData::UnionConstPtr valueType;
void reset();
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTUnion;
};
}
typedef std::tr1::shared_ptr<detail::NTUnionBuilder> NTUnionBuilderPtr;
/**
* @brief Convenience Class for NTUnion
*
* @author dgh
*/
class epicsShareClass NTUnion
{
public:
POINTER_DEFINITIONS(NTUnion);
static const std::string URI;
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTUnion.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTUnion.
* @return NTUnion instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Wrap (aka dynamic cast, or wrap) the structure to NTUnion without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTUnion.
* @return NTUnion instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Is the structure an NTUnion.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTUnion.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Is the structure an NTUnion.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTUnion.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Is the Structure compatible with NTUnion.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTUnion.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Is the PVStructure compatible with NTUnion.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTUnion.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Checks if the specified structure is a valid NTUnion.
*
* Checks whether the wrapped structure is valid with respect to this
* version of NTUnion
* @return (false,true) if (is not, is) a valid NTUnion.
*/
bool isValid();
/**
* Create a NTUnion builder instance.
* @return builder instance.
*/
static NTUnionBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTUnion() {}
/**
* Attach a pvTimeStamp.
* @param pvTimeStamp The pvTimeStamp that will be attached.
* Does nothing if no timeStamp.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attach an pvAlarm.
* @param pvAlarm The pvAlarm that will be attached.
* Does nothing if no alarm.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Get the descriptor field.
* @return The pvString or null if no function field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Get the timeStamp.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Get the alarm.
* @return PVStructurePtr which may be null.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Get the value field.
* @return The PVUnion for the values.
*/
epics::pvData::PVUnionPtr getValue() const;
private:
NTUnion(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTUnion;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTUnionBuilder;
};
}}
#endif /* NTUNION_H */

View File

@@ -1,7 +1,8 @@
/* nturi.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <algorithm>
@@ -126,15 +127,15 @@ NTURIBuilder::shared_pointer NTURIBuilder::add(string const & name, FieldConstPt
const std::string NTURI::URI("epics:nt/NTURI:1.0");
NTURI::shared_pointer NTURI::wrap(PVStructurePtr const & pvStructure)
NTURI::shared_pointer NTURI::wrap(PVStructurePtr const & structure)
{
if(!isCompatible(pvStructure)) return shared_pointer();
return wrapUnsafe(pvStructure);
if(!isCompatible(structure)) return shared_pointer();
return wrapUnsafe(structure);
}
NTURI::shared_pointer NTURI::wrapUnsafe(PVStructurePtr const & pvStructure)
NTURI::shared_pointer NTURI::wrapUnsafe(PVStructurePtr const & structure)
{
return shared_pointer(new NTURI(pvStructure));
return shared_pointer(new NTURI(structure));
}
bool NTURI::is_a(StructureConstPtr const & structure)
@@ -142,11 +143,6 @@ bool NTURI::is_a(StructureConstPtr const & structure)
return NTUtils::is_a(structure->getID(), URI);
}
bool NTURI::is_a(PVStructurePtr const & pvStructure)
{
return is_a(pvStructure->getStructure());
}
bool NTURI::isCompatible(StructureConstPtr const & structure)
{
if (!structure.get()) return false;

View File

@@ -1,7 +1,8 @@
/* nturi.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTURI_H
#define NTURI_H
@@ -44,13 +45,13 @@ namespace detail {
POINTER_DEFINITIONS(NTURIBuilder);
/**
* Adds authority field to the NTURI.
* Add authority field to the NTURI.
* @return this instance of <b>NTURIBuilder</b>.
*/
shared_pointer addAuthority();
/**
* Adds extra <b>Scalar</b> of ScalarType pvString
* Add extra <b>Scalar</b> of ScalarType pvString
* to the query field of the type.
* @param name name of the field.
* @return this instance of <b>NTURIBuilder</b>.
@@ -58,7 +59,7 @@ namespace detail {
shared_pointer addQueryString(std::string const & name);
/**
* Adds extra <b>Scalar</b> of ScalarType pvDouble
* Add extra <b>Scalar</b> of ScalarType pvDouble
* to the query field of the type.
* @param name name of the field.
* @return this instance of <b>NTURIBuilder</b>.
@@ -66,7 +67,7 @@ namespace detail {
shared_pointer addQueryDouble(std::string const & name);
/**
* Adds extra <b>Scalar</b> of ScalarType pvInt
* Add extra <b>Scalar</b> of ScalarType pvInt
* to the query field of the type.
* @param name name of the field.
* @return this instance of <b>NTURIBuilder</b>.
@@ -74,14 +75,14 @@ namespace detail {
shared_pointer addQueryInt(std::string const & name);
/**
* Creates a <b>Structure</b> that represents NTURI.
* Create a <b>Structure</b> that represents NTURI.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTURI.
* Create a <b>PVStructure</b> that represents NTURI.
* The returned PVStructure will have labels equal to the column names.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
@@ -89,18 +90,17 @@ namespace detail {
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTURI</b> instance.
* Create a <b>NTURI</b> instance.
* The returned NTURI will wrap a PVStructure which will have
* labels equal to the column names.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTURI</b>.
*/
NTURIPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* Add extra <b>Field</b> to the type.
* @param name name of the field.
* @param field a field to add.
* @return this instance of <b>NTURIBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
@@ -141,91 +141,65 @@ public:
static const std::string URI;
/**
* Creates an NTURI wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTURI
* and if so returns an NTURI which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTURI instance wrapping pvStructure on success, null otherwise
* Wrap (aka dynamic cast, or wrap) the structure to NTURI.
* First isCompatible is called.
* This method will nullptr if the structure is is not compatible.
* This method will nullptr if the structure is nullptr.
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTURI.
* @return NTURI instance on success, nullptr otherwise.
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrap(epics::pvData::PVStructurePtr const & structure);
/**
* Creates an NTScalar wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTScalar or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTScalar instance wrapping pvStructure
* Wrap (aka dynamic cast, or wrap) the structure to NTMultiChannel without checking for isCompatible
* @param structure The structure to wrap-ed (dynamic cast, wrapped) to NTURI.
* @return NTURI instance.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & structure);
/**
* Returns whether the specified Structure reports to be a compatible NTScalar.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTScalar through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if (is not, is) a compatible NTScalar
* Is the structure an NTURI.
* @param structure The structure to test.
* @return (false,true) if (is not, is) an NTURI.
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTURI.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTURI through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test.
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTURI.
* Is the structure an NTURI.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTURI.
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTURI.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTURI through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTURI
* Is the Structure compatible with NTURI.
* This method introspects the fields to see if they are compatible.
* @param structure The Structure to test.
* @return (false,true) if (is not, is) an NTURI.
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTURI.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTURI through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTURI
* Is the PVStructure compatible with NTURI.
* This method introspects the fields to see if they are compatible.
* @param pvStructure The PVStructure to test.
* @return (false,true) if (is not, is) an NTURI.
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is a valid NTURI.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
* Checks if the specified structure is a valid NTURI.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTURI.
* Checks whether the wrapped structure is valid with respect to this
* version of NTURI
* @return (false,true) if (is not, is) a valid NTURI.
*/
bool isValid();
/**
* Creates an NTURI builder instance.
* Create a NTURI builder instance.
* @return builder instance.
*/
static NTURIBuilderPtr createBuilder();
@@ -236,37 +210,37 @@ public:
~NTURI() {}
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
* Get the pvStructure.
* @return PVStructurePtr.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the scheme field.
* @return the scheme field.
* Get the scheme field.
* @return The PVString for the scheme.
*/
epics::pvData::PVStringPtr getScheme() const;
/**
* Returns the authority field.
* @return the authority field or null if no such field.
* Get the authority field.
* @return The PVString for the authority.
*/
epics::pvData::PVStringPtr getAuthority() const;
/**
* Returns the path field.
* @return the path field.
* Get the path field.
* @return The PVString for the path.
*/
epics::pvData::PVStringPtr getPath() const;
/**
* Returns the query field.
* @return the query field or null if no such field.
* Get the query field.
* @return The PVStructure for the query.
*/
epics::pvData::PVStructurePtr getQuery() const;
/**
* Returns the names of the query fields for the URI.
* Get the names of the query fields for the URI.
* For each name, calling getQueryField should return
* the query field, which should not be null.
* @return The query field names.
@@ -274,25 +248,21 @@ public:
epics::pvData::StringArray const & getQueryNames() const;
/**
* Returns the subfield of the query field with the specified name.
* @param name the name of the subfield.
* @return the the subfield of the query field or null if the field does not exist.
* Get the PVField (column) for a field that follows the label field.
* @param columnName The name of the column.
* @return The PVFieldPtr for the field.
*/
epics::pvData::PVFieldPtr getQueryField(std::string const & name) const;
epics::pvData::PVFieldPtr getQueryField(std::string const & columnName) const;
/**
* Returns the subfield of the query field (parameter) with the specified
* name and of a specified expected type (for example, PVString).
* @tparam PVT the expected type of the subfield which should be
* be PVString, PVInt pr PVDouble.
* @param name the subfield of the query field or null if the field does
* not exist or is not of the expected type.
* @return The PVT field.
* Get the PVField (column) for a field that follows the label field of a specified type (e.g. PVDoubleArray).
* @param columnName The name of the column.
* @return The <PVT> field.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getQueryField(std::string const & name) const
std::tr1::shared_ptr<PVT> getQueryField(std::string const & columnName) const
{
epics::pvData::PVFieldPtr pvField = getQueryField(name);
epics::pvData::PVFieldPtr pvField = getQueryField(columnName);
if (pvField.get())
return std::tr1::dynamic_pointer_cast<PVT>(pvField);
else

View File

@@ -1,7 +1,8 @@
/* ntutils.cpp */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#define epicsExportSharedSymbols

View File

@@ -1,7 +1,8 @@
/* ntutils.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#ifndef NTUTILS_H
#define NTUTILS_H
@@ -22,9 +23,9 @@ public:
/**
* Checks whether NT types are compatible by checking their IDs,
* i.e. their names and major version must match.
* @param u1 the first URI.
* @param u2 the second URI.
* @return true if URIs are compatible, false otherwise.
* @param u1 the first uri.
* @param u2 the second uri.
* @return true of URIs are compatible, false otherwise.
*/
static bool is_a(const std::string &u1, const std::string &u2);

View File

@@ -1,294 +0,0 @@
/* ntattribute.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTATTRIBUTE_H
#define NTATTRIBUTE_H
#ifdef epicsExportSharedSymbols
# define ntattributeEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntattributeEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntattributeEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTAttribute;
typedef std::tr1::shared_ptr<NTAttribute> NTAttributePtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTAttribute.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTAttributeBuilder :
public std::tr1::enable_shared_from_this<NTAttributeBuilder>
{
public:
POINTER_DEFINITIONS(NTAttributeBuilder);
/**
* Adds tags field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addTags();
/**
* Adds descriptor field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTAttribute.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTAttribute</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTAttribute</b>.
*/
NTAttributePtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTAttributeBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
protected://private:
NTAttributeBuilder();
void reset();
bool tags;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTAttribute;
};
}
typedef std::tr1::shared_ptr<detail::NTAttributeBuilder> NTAttributeBuilderPtr;
/**
* @brief Convenience Class for NTAttribute
*
* @author dgh
*/
class epicsShareClass NTAttribute
{
public:
POINTER_DEFINITIONS(NTAttribute);
static const std::string URI;
/**
* Creates an NTAttribute wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTAttribute
* and if so returns an NTAttribute which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTAttribute instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTAttribute wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTAttribute or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTAttribute instance wrapping pvStructure
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTAttribute.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTAttribute through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAttribute
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTAttribute.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTAttribute through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAttribute
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTAttribute.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTAttribute through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAttribute
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTAttribute.
* <p>
* Checks if the specified tructure is compatible with this version
* of NTAttribute through the introspection interface.
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAttribute
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTAttribute.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTAttribute
*/
bool isValid();
/**
* Creates an NTAttribute builder instance.
* @return builder instance.
*/
static NTAttributeBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTAttribute() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the name field.
* @return the name field.
*/
epics::pvData::PVStringPtr getName() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVUnionPtr getValue() const;
/**
* Returns the tags field.
* @return the tags field or null if no such field.
*/
epics::pvData::PVStringArrayPtr getTags() const;
private:
NTAttribute(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTAttribute;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTAttributeBuilder;
};
}}
#endif /* NTATTRIBUTE_H */

View File

@@ -1,288 +0,0 @@
/* ntcontinuum.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTCONTINUUM_H
#define NTCONTINUUM_H
#ifdef epicsExportSharedSymbols
# define ntcontinuumEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntcontinuumEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntcontinuumEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTContinuum;
typedef std::tr1::shared_ptr<NTContinuum> NTContinuumPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTContinuum.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTContinuumBuilder :
public std::tr1::enable_shared_from_this<NTContinuumBuilder>
{
public:
POINTER_DEFINITIONS(NTContinuumBuilder);
/**
* Adds descriptor field to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTContinuum.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTContinuum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTContinuum.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTContinuum</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTContinuum</b>.
*/
NTContinuumPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTContinuumBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTContinuumBuilder();
void reset();
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTContinuum;
};
}
typedef std::tr1::shared_ptr<detail::NTContinuumBuilder> NTContinuumBuilderPtr;
/**
* @brief Convenience Class for NTContinuum
*
* @author dgh
*/
class epicsShareClass NTContinuum
{
public:
POINTER_DEFINITIONS(NTContinuum);
static const std::string URI;
/**
* Creates an NTContinuum wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied structure is compatible with NTContinuum
* and if so returns an NTContinuum which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTContinuum instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTContinuum wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTContinuum or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTContinuum instance wrapping pvStructure.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTContinuum.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTContinuum through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTContinuum
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTContinuum.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTContinuum through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type
*
* @param pvStructure The PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTContinuum
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTContinuum.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTContinuum through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTContinuum
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTContinuum.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTContinuum through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTContinuum
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped structure is valid with respect to this
* version of NTContinuum.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTContinuum
*/
bool isValid();
/**
* Creates an NTContinuum builder instance.
* @return builder instance.
*/
static NTContinuumBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTContinuum() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the base field.
* @return the base field.
*/
epics::pvData::PVDoubleArrayPtr getBase() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVDoubleArrayPtr getValue() const;
/**
* Returns the units field.
* @return the units field.
*/
epics::pvData::PVStringArrayPtr getUnits() const;
private:
NTContinuum(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTContinuum;
epics::pvData::PVDoubleArrayPtr pvValue;
friend class detail::NTContinuumBuilder;
};
}}
#endif /* NTCONTINUUM_H */

View File

@@ -1,305 +0,0 @@
/* nthistogram.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTHISTOGRAM_H
#define NTHISTOGRAM_H
#ifdef epicsExportSharedSymbols
# define nthistogramEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef nthistogramEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef nthistogramEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTHistogram;
typedef std::tr1::shared_ptr<NTHistogram> NTHistogramPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTHistogram.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTHistogramBuilder :
public std::tr1::enable_shared_from_this<NTHistogramBuilder>
{
public:
POINTER_DEFINITIONS(NTHistogramBuilder);
/**
* Sets the scalar type of the value field array.
* @param scalarType the scalar type of the value field array.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer value(epics::pvData::ScalarType scalarType);
/**
* Adds descriptor field to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTHistogram.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTHistogram.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTHistogram.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTHistogram</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTHistogram</b>.
*/
NTHistogramPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTHistogramBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTHistogramBuilder();
void reset();
bool valueTypeSet;
epics::pvData::ScalarType valueType;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTHistogram;
};
}
typedef std::tr1::shared_ptr<detail::NTHistogramBuilder> NTHistogramBuilderPtr;
/**
* @brief Convenience Class for NTHistogram
*
* @author dgh
*/
class epicsShareClass NTHistogram
{
public:
POINTER_DEFINITIONS(NTHistogram);
static const std::string URI;
/**
* Creates an NTHistogram wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTHistogram
* and if so returns an NTHistogram which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTHistogram instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTHistogram wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTHistogram or is non-null.
*
* @param pvStructure the PVStructure to be wrapped.
* @return NTHistogram instance wrapping pvStructure.
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTHistogram.
* <p>
* Checks whether the specified Structure reports compatibility with this
* version of NTHistogram through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test.
* @return (false,true) if the specified Structure (is not, is) a compatible NTHistogram
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTHistogram.
* <p>
* Checks whether the specified PVStructure reports compatibility with this
* version of NTHistogram through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTHistogram
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTHistogram.
* <p>
* Checks whether the specified Structure is compatible with this version
* of NTHistogram through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTHistogram
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTHistogram.
* <p>
* Checks whether the specified PVStructure is compatible with this version
* of NTHistogram through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTHistogram
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped structure is valid with respect to this
* version of NTHistogram.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTHistogram
*/
bool isValid();
/**
* Creates an NTHistogram builder instance.
* @return builder instance.
*/
static NTHistogramBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTHistogram() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Get the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the ranges field.
* @return the ranges field.
*/
epics::pvData::PVDoubleArrayPtr getRanges() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVScalarArrayPtr getValue() const;
/**
* Returns the value field of a specified type (e.g. PVIntArray).
* @tparam PVT the expected type of the value field which should be
* be PVShortArray, PVIntArray pr PVLongArray.
* @return the value field or null if it is not of the expected type.
*/
template<typename PVT>
std::tr1::shared_ptr<PVT> getValue() const
{
return std::tr1::dynamic_pointer_cast<PVT>(pvValue);
}
private:
NTHistogram(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTHistogram;
epics::pvData::PVScalarArrayPtr pvValue;
friend class detail::NTHistogramBuilder;
};
}}
#endif /* NTHISTOGRAM_H */

View File

@@ -1,312 +0,0 @@
/* ntmatrix.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTMATRIX_H
#define NTMATRIX_H
#ifdef epicsExportSharedSymbols
# define ntmatrixEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#include <pv/pvDisplay.h>
#ifdef ntmatrixEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntmatrixEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTMatrix;
typedef std::tr1::shared_ptr<NTMatrix> NTMatrixPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTMatrix.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTMatrixBuilder :
public std::tr1::enable_shared_from_this<NTMatrixBuilder>
{
public:
POINTER_DEFINITIONS(NTMatrixBuilder);
/**
* Adds dimension field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDim();
/**
* Adds descriptor field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Adds display field to the NTMatrix.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer addDisplay();
/**
* Creates a <b>Structure</b> that represents NTMatrix.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTMatrix.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTMatrix</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of <b>NTMatrix</b>.
*/
NTMatrixPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTMatrixBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTMatrixBuilder();
void reset();
bool dim;
bool descriptor;
bool alarm;
bool timeStamp;
bool display;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTMatrix;
};
}
typedef std::tr1::shared_ptr<detail::NTMatrixBuilder> NTMatrixBuilderPtr;
/**
* @brief Convenience Class for NTMatrix
*
* @author dgh
*/
class epicsShareClass NTMatrix
{
public:
POINTER_DEFINITIONS(NTMatrix);
static const std::string URI;
/**
* Creates an NTMatrix wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTMatrix
* and if so returns an NTMatrix which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTMatrix instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTMatrix wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTMatrix or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTMatrix instance wrapping pvStructure
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTMatrix.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTMatrix through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTMatrix
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTMatrix.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTMatrix through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTMatrix
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTMatrix.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTMatrix through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTMatrix
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTMatrix.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTMatrix through the introspection interface.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTMatrix
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTMatrix.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTMatrix
*/
bool isValid();
/**
* Creates an NTMatrix builder instance.
* @return builder instance.
*/
static NTMatrixBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTMatrix() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Attaches a PVDisplay to the wrapped PVStructure.
* Does nothing if no display.
* @param pvDisplay the PVDisplay that will be attached.
* @return true if the operation was successfull (i.e. this instance has a display field), otherwise false.
*/
bool attachDisplay(epics::pvData::PVDisplay &pvDisplay) const;
/**
* Get the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no such field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no such field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the display field.
* @return the display field or null if no such field.
*/
epics::pvData::PVStructurePtr getDisplay() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVDoubleArrayPtr getValue() const;
/**
* Returns the dim field.
* @return the dim field or or null if no such field.
*/
epics::pvData::PVIntArrayPtr getDim() const;
private:
NTMatrix(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTMatrix;
epics::pvData::PVDoubleArrayPtr pvValue;
friend class detail::NTMatrixBuilder;
};
}}
#endif /* NTMATRIX_H */

View File

@@ -1,312 +0,0 @@
/* ntndarrayAttribute.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTNDARRAYATTRIBUTE_H
#define NTNDARRAYATTRIBUTE_H
#ifdef epicsExportSharedSymbols
# define ntndarrayAttributeEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntndarrayAttributeEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntndarrayAttributeEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTNDArrayAttribute;
typedef std::tr1::shared_ptr<NTNDArrayAttribute> NTNDArrayAttributePtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTAttribute extended as required by NTNDArray
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTNDArrayAttributeBuilder :
public std::tr1::enable_shared_from_this<NTNDArrayAttributeBuilder>
{
public:
POINTER_DEFINITIONS(NTNDArrayAttributeBuilder);
/**
* Adds tags field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addTags();
/**
* Adds descriptor field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTNDArrayAttribute.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTNDArrayAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTNDArrayAttribute.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTNDArrayAttribute</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTNDArrayAttribute</b>.
*/
NTNDArrayAttributePtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTNDArrayAttributeBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
protected://private:
NTNDArrayAttributeBuilder();
void reset();
bool tags;
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTNDArrayAttribute;
};
}
typedef std::tr1::shared_ptr<detail::NTNDArrayAttributeBuilder> NTNDArrayAttributeBuilderPtr;
/**
* @brief Convenience Class for NTNDArrayAttribute
*
* @author dgh
*/
class epicsShareClass NTNDArrayAttribute
{
public:
POINTER_DEFINITIONS(NTNDArrayAttribute);
static const std::string URI;
/**
* Creates an NTNDArrayAttribute wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTAttribute
* extended as required by NTNDArray and if so returns an
* NTNDArrayAttribute which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTAttribute instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTNDArrayAttribute wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTAttribute extended as required by NTNDArray
* or is non-null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTAttribute instance wrapping pvStructure
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTAttribute.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTAttribute through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAttribute
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTAttribute.
* <p>
* Checks if the specified PVStructure reports compatibility with this
* version of NTAttribute through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAttribute
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTAttribute
* extended as required by NTNDArray.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTAttribute extended as required by this version of NTNDArray
* through the introspection interface.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTAttribute
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTAttribute
* extended as required by NTNDArray.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTAttribute extended as required by this version of NTNDArray
* through the introspection interface.
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTAttribute
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is valid with respect to this
* version of NTAttribute extended as per this version of NTNDArray.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if the wrapped PVStructure (is not, is) a valid NTNDArrayAttribute
*/
bool isValid();
/**
* Creates an NTNDArrayAttribute builder instance.
* @return builder instance.
*/
static NTNDArrayAttributeBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTNDArrayAttribute() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no such field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the name field.
* @return the name field.
*/
epics::pvData::PVStringPtr getName() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVUnionPtr getValue() const;
/**
* Returns the tags field.
* @return the tags field or null if no such field.
*/
epics::pvData::PVStringArrayPtr getTags() const;
/**
* Returns the sourceType field.
* @return the sourceType field.
*/
epics::pvData::PVIntPtr getSourceType() const;
/**
* Returns the source field.
* @return the source field.
*/
epics::pvData::PVStringPtr getSource() const;
private:
NTNDArrayAttribute(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTNDArrayAttribute;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTNDArrayAttributeBuilder;
};
}}
#endif /* NTNDARRAYATTRIBUTE_H */

View File

@@ -1,280 +0,0 @@
/* ntunion.h */
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
*/
#ifndef NTUNION_H
#define NTUNION_H
#ifdef epicsExportSharedSymbols
# define ntunionEpicsExportSharedSymbols
# undef epicsExportSharedSymbols
#endif
#ifdef ntunionEpicsExportSharedSymbols
# define epicsExportSharedSymbols
# undef ntunionEpicsExportSharedSymbols
#endif
#include <pv/ntfield.h>
#include <shareLib.h>
namespace epics { namespace nt {
class NTUnion;
typedef std::tr1::shared_ptr<NTUnion> NTUnionPtr;
namespace detail {
/**
* @brief Interface for in-line creating of NTUnion.
*
* One instance can be used to create multiple instances.
* An instance of this object must not be used concurrently (an object has a state).
* @author dgh
*/
class epicsShareClass NTUnionBuilder :
public std::tr1::enable_shared_from_this<NTUnionBuilder>
{
public:
POINTER_DEFINITIONS(NTUnionBuilder);
/**
* Specifies the union for the value field.
* If this is not called then a variant union is the default.
* @param unionType the introspection object for the union value field
* @return this instance of NTUnionBuilder
*/
shared_pointer value(epics::pvData::UnionConstPtr unionType);
/**
* Adds descriptor field to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addDescriptor();
/**
* Adds alarm field to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addAlarm();
/**
* Adds timeStamp field to the NTUnion.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer addTimeStamp();
/**
* Creates a <b>Structure</b> that represents NTUnion.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>Structure</b>.
*/
epics::pvData::StructureConstPtr createStructure();
/**
* Creates a <b>PVStructure</b> that represents NTUnion.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>PVStructure</b>.
*/
epics::pvData::PVStructurePtr createPVStructure();
/**
* Creates a <b>NTUnion</b> instance.
* This resets this instance state and allows new instance to be created.
* @return a new instance of a <b>NTUnion</b>.
*/
NTUnionPtr create();
/**
* Adds extra <b>Field</b> to the type.
* @param name the name of the field.
* @param field the field to be added.
* @return this instance of <b>NTUnionBuilder</b>.
*/
shared_pointer add(std::string const & name, epics::pvData::FieldConstPtr const & field);
private:
NTUnionBuilder();
epics::pvData::UnionConstPtr valueType;
void reset();
bool descriptor;
bool alarm;
bool timeStamp;
// NOTE: this preserves order, however it does not handle duplicates
epics::pvData::StringArray extraFieldNames;
epics::pvData::FieldConstPtrArray extraFields;
friend class ::epics::nt::NTUnion;
};
}
typedef std::tr1::shared_ptr<detail::NTUnionBuilder> NTUnionBuilderPtr;
/**
* @brief Convenience Class for NTUnion
*
* @author dgh
*/
class epicsShareClass NTUnion
{
public:
POINTER_DEFINITIONS(NTUnion);
static const std::string URI;
/**
* Creates an NTUnion wrapping the specified PVStructure if the latter is compatible.
* <p>
* Checks the supplied PVStructure is compatible with NTUnion
* and if so returns an NTUnion which wraps it.
* This method will return null if the structure is is not compatible
* or is null.
*
* @param pvStructure the PVStructure to be wrapped
* @return NTUnion instance wrapping pvStructure on success, null otherwise
*/
static shared_pointer wrap(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Creates an NTUnion wrapping the specified PVStructure, regardless of the latter's compatibility.
* <p>
* No checks are made as to whether the specified PVStructure
* is compatible with NTUnion or is non-null.
* @param pvStructure the PVStructure to be wrapped
* @return NTUnion instance wrapping pvStructure
*/
static shared_pointer wrapUnsafe(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure reports to be a compatible NTUnion.
* <p>
* Checks if the specified Structure reports compatibility with this
* version of NTUnion through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTUnion
*/
static bool is_a(epics::pvData::StructureConstPtr const & structure);
/**
* Returns whether the specified PVStructure reports to be a compatible NTUnion.
*
* Checks if the specified PVStructure reports compatibility with this
* version of NTUnion through its type ID, including checking version numbers.
* The return value does not depend on whether the structure is actually
* compatible in terms of its introspection type.
*
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTUnion
*/
static bool is_a(epics::pvData::PVStructurePtr const & pvStructure);
/**
* Returns whether the specified Structure is compatible with NTUnion.
* <p>
* Checks if the specified Structure is compatible with this version
* of NTUnion through the introspection interface.
* @param structure the Structure to test
* @return (false,true) if the specified Structure (is not, is) a compatible NTUnion
*/
static bool isCompatible(
epics::pvData::StructureConstPtr const &structure);
/**
* Returns whether the specified PVStructure is compatible with NTUnion.
* <p>
* Checks if the specified PVStructure is compatible with this version
* of NTUnion through the introspection interface
* @param pvStructure the PVStructure to test
* @return (false,true) if the specified PVStructure (is not, is) a compatible NTUnion
*/
static bool isCompatible(
epics::pvData::PVStructurePtr const &pvStructure);
/**
* Returns whether the wrapped PVStructure is a valid NTUnion.
* <p>
* Unlike isCompatible(), isValid() may perform checks on the value
* data as well as the introspection data.
*
* @return (false,true) if wrapped PVStructure (is not, is) a valid NTUnion
*/
bool isValid();
/**
* Creates an NTUnion builder instance.
* @return builder instance.
*/
static NTUnionBuilderPtr createBuilder();
/**
* Destructor.
*/
~NTUnion() {}
/**
* Attaches a PVTimeStamp to the wrapped PVStructure.
* Does nothing if no timeStamp field.
* @param pvTimeStamp the PVTimeStamp that will be attached.
* @return true if the operation was successfull (i.e. this instance has a timeStamp field), otherwise false.
*/
bool attachTimeStamp(epics::pvData::PVTimeStamp &pvTimeStamp) const;
/**
* Attaches a PVAlarm to the wrapped PVStructure.
* Does nothing if no alarm field.
* @param pvAlarm the PVAlarm that will be attached.
* @return true if the operation was successfull (i.e. this instance has an alarm field), otherwise false.
*/
bool attachAlarm(epics::pvData::PVAlarm &pvAlarm) const;
/**
* Returns the PVStructure wrapped by this instance.
* @return the PVStructure wrapped by this instance.
*/
epics::pvData::PVStructurePtr getPVStructure() const;
/**
* Returns the descriptor field.
* @return the descriptor field or null if no descriptor field.
*/
epics::pvData::PVStringPtr getDescriptor() const;
/**
* Returns the timeStamp field.
* @return the timStamp field or null if no timeStamp field.
*/
epics::pvData::PVStructurePtr getTimeStamp() const;
/**
* Returns the alarm field.
* @return the alarm field or null if no alarm field.
*/
epics::pvData::PVStructurePtr getAlarm() const;
/**
* Returns the value field.
* @return the value field.
*/
epics::pvData::PVUnionPtr getValue() const;
private:
NTUnion(epics::pvData::PVStructurePtr const & pvStructure);
epics::pvData::PVStructurePtr pvNTUnion;
epics::pvData::PVUnionPtr pvValue;
friend class detail::NTUnionBuilder;
};
}}
#endif /* NTUNION_H */

View File

@@ -1,80 +1,5 @@
TOP=..
TOP = ..
include $(TOP)/configure/CONFIG
PROD_LIBS += nt pvData Com
TESTPROD_HOST += ntfieldTest
ntfieldTest_SRCS += ntfieldTest.cpp
TESTS += ntfieldTest
TESTPROD_HOST += ntscalarTest
ntscalarTest_SRCS += ntscalarTest.cpp
TESTS += ntscalarTest
TESTPROD_HOST += ntscalarArrayTest
ntscalarArrayTest_SRCS += ntscalarArrayTest.cpp
TESTS += ntscalarArrayTest
TESTPROD_HOST += ntnameValueTest
ntnameValueTest_SRCS += ntnameValueTest.cpp
TESTS += ntnameValueTest
TESTPROD_HOST += ntmultiChannelTest
ntmultiChannelTest_SRCS += ntmultiChannelTest.cpp
TESTS += ntmultiChannelTest
TESTPROD_HOST += ntscalarMultiChannelTest
ntscalarMultiChannelTest_SRCS += ntscalarMultiChannelTest.cpp
TESTS += ntscalarMultiChannelTest
TESTPROD_HOST += nttableTest
nttableTest_SRCS = nttableTest.cpp
TESTS += nttableTest
TESTPROD_HOST += ntndarrayTest
ntndarrayTest_SRCS = ntndarrayTest.cpp
TESTS += ntndarrayTest
TESTPROD_HOST += ntmatrixTest
ntmatrixTest_SRCS = ntmatrixTest.cpp
TESTS += ntmatrixTest
TESTPROD_HOST += ntenumTest
ntenumTest_SRCS = ntenumTest.cpp
TESTS += ntenumTest
TESTPROD_HOST += ntunionTest
ntunionTest_SRCS = ntunionTest.cpp
TESTS += ntunionTest
TESTPROD_HOST += ntaggregateTest
ntaggregateTest_SRCS = ntaggregateTest.cpp
TESTS += ntaggregateTest
TESTPROD_HOST += ntattributeTest
ntattributeTest_SRCS = ntattributeTest.cpp
TESTS += ntattributeTest
TESTPROD_HOST += ntndarrayAttributeTest
ntndarrayAttributeTest_SRCS = ntndarrayAttributeTest.cpp
TESTS += ntndarrayAttributeTest
TESTPROD_HOST += ntcontinuumTest
ntcontinuumTest = ntcontinuumTest.cpp
TESTS += ntcontinuumTest
TESTPROD_HOST += nthistogramTest
nthistogramTest_SRCS = nthistogramTest.cpp
TESTS += nthistogramTest
TESTPROD_HOST += ntutilsTest
ntutilsTest_SRCS = ntutilsTest.cpp
TESTS += ntutilsTest
TESTSCRIPTS_HOST += $(TESTS:%=%.t)
include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE
DIRS += nt
include $(TOP)/configure/RULES_DIRS

80
test/nt/Makefile Normal file
View File

@@ -0,0 +1,80 @@
TOP=../..
include $(TOP)/configure/CONFIG
PROD_LIBS += nt pvData Com
TESTPROD_HOST += ntfieldTest
ntfieldTest_SRCS += ntfieldTest.cpp
TESTS += ntfieldTest
TESTPROD_HOST += ntscalarTest
ntscalarTest_SRCS += ntscalarTest.cpp
TESTS += ntscalarTest
TESTPROD_HOST += ntscalarArrayTest
ntscalarArrayTest_SRCS += ntscalarArrayTest.cpp
TESTS += ntscalarArrayTest
TESTPROD_HOST += ntnameValueTest
ntnameValueTest_SRCS += ntnameValueTest.cpp
TESTS += ntnameValueTest
TESTPROD_HOST += ntmultiChannelTest
ntmultiChannelTest_SRCS += ntmultiChannelTest.cpp
TESTS += ntmultiChannelTest
TESTPROD_HOST += ntscalarMultiChannelTest
ntscalarMultiChannelTest_SRCS += ntscalarMultiChannelTest.cpp
TESTS += ntscalarMultiChannelTest
TESTPROD_HOST += nttableTest
nttableTest_SRCS = nttableTest.cpp
TESTS += nttableTest
TESTPROD_HOST += ntndarrayTest
ntndarrayTest_SRCS = ntndarrayTest.cpp
TESTS += ntndarrayTest
TESTPROD_HOST += ntmatrixTest
ntmatrixTest_SRCS = ntmatrixTest.cpp
TESTS += ntmatrixTest
TESTPROD_HOST += ntenumTest
ntenumTest_SRCS = ntenumTest.cpp
TESTS += ntenumTest
TESTPROD_HOST += ntunionTest
ntunionTest_SRCS = ntunionTest.cpp
TESTS += ntunionTest
TESTPROD_HOST += ntaggregateTest
ntaggregateTest_SRCS = ntaggregateTest.cpp
TESTS += ntaggregateTest
TESTPROD_HOST += ntattributeTest
ntattributeTest_SRCS = ntattributeTest.cpp
TESTS += ntattributeTest
TESTPROD_HOST += ntndarrayAttributeTest
ntndarrayAttributeTest_SRCS = ntndarrayAttributeTest.cpp
TESTS += ntndarrayAttributeTest
TESTPROD_HOST += ntcontinuumTest
ntattributeTest_SRCS = ntcontinuumTest.cpp
TESTS += ntcontinuumTest
TESTPROD_HOST += nthistogramTest
ntattributeTest_SRCS = nthistogramTest.cpp
TESTS += nthistogramTest
TESTPROD_HOST += ntutilsTest
ntutilsTest_SRCS = ntutilsTest.cpp
TESTS += ntutilsTest
TESTSCRIPTS_HOST += $(TESTS:%=%.t)
include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -65,9 +66,6 @@ void test_ntaggregate()
create();
testOk1(ntAggregate.get() != 0);
testOk1(NTAggregate::is_a(ntAggregate->getPVStructure()));
testOk1(NTAggregate::isCompatible(ntAggregate->getPVStructure()));
testOk1(ntAggregate->getPVStructure().get() != 0);
testOk1(ntAggregate->getValue().get() != 0);
testOk1(ntAggregate->getDescriptor().get() != 0);
@@ -167,7 +165,7 @@ void test_wrap()
}
MAIN(testNTAggregate) {
testPlan(30);
testPlan(28);
test_builder();
test_ntaggregate();
test_wrap();

View File

@@ -1,6 +1,8 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*
*/
#include <epicsUnitTest.h>
#include <testMain.h>
@@ -74,9 +76,6 @@ void test_ntattribute()
create();
testOk1(ntAttribute.get() != 0);
testOk1(NTAttribute::is_a(ntAttribute->getPVStructure()));
testOk1(NTAttribute::isCompatible(ntAttribute->getPVStructure()));
testOk1(ntAttribute->getPVStructure().get() != 0);
testOk1(ntAttribute->getName().get() != 0);
testOk1(ntAttribute->getValue().get() != 0);
@@ -167,7 +166,7 @@ void test_wrap()
}
MAIN(testNTAttribute) {
testPlan(35);
testPlan(33);
test_builder();
test_ntattribute();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -71,9 +72,6 @@ void test_ntcontinuum()
create();
testOk1(ntContinuum.get() != 0);
testOk1(NTContinuum::is_a(ntContinuum->getPVStructure()));
testOk1(NTContinuum::isCompatible(ntContinuum->getPVStructure()));
testOk1(ntContinuum->getPVStructure().get() != 0);
testOk1(ntContinuum->getDescriptor().get() != 0);
testOk1(ntContinuum->getAlarm().get() != 0);
@@ -267,7 +265,7 @@ void test_extra()
MAIN(testNTContinuum) {
testPlan(61);
testPlan(59);
test_builder();
test_ntcontinuum();
test_wrap();

View File

@@ -1,7 +1,9 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
#include <testMain.h>
@@ -65,9 +67,6 @@ void test_ntenum()
create();
testOk1(ntEnum.get() != 0);
testOk1(NTEnum::is_a(ntEnum->getPVStructure()));
testOk1(NTEnum::isCompatible(ntEnum->getPVStructure()));
testOk1(ntEnum->getPVStructure().get() != 0);
testOk1(ntEnum->getValue().get() != 0);
testOk1(ntEnum->getDescriptor().get() != 0);
@@ -179,7 +178,7 @@ void test_wrap()
}
MAIN(testNTEnum) {
testPlan(32);
testPlan(30);
test_builder();
test_ntenum();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
/*
* ntfieldTest.cpp

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -83,9 +84,6 @@ void test_nthistogram()
create();
testOk1(ntHistogram.get() != 0);
testOk1(NTHistogram::is_a(ntHistogram->getPVStructure()));
testOk1(NTHistogram::isCompatible(ntHistogram->getPVStructure()));
testOk1(ntHistogram->getPVStructure().get() != 0);
testOk1(ntHistogram->getDescriptor().get() != 0);
testOk1(ntHistogram->getAlarm().get() != 0);
@@ -252,7 +250,7 @@ void test_extra()
MAIN(testNTHistogram) {
testPlan(52);
testPlan(50);
test_builder();
test_nthistogram();
test_wrap();

View File

@@ -1,7 +1,9 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
#include <testMain.h>
@@ -57,7 +59,7 @@ void test_ntmatrix()
NTMatrixBuilderPtr builder = NTMatrix::createBuilder();
testOk(builder.get() != 0, "Got builder");
NTMatrixPtr ntMatrix = builder->
NTMatrixPtr ntScalarArray = builder->
//arrayValue(pvInt)->
addDim()->
addDescriptor()->
@@ -65,18 +67,15 @@ void test_ntmatrix()
addTimeStamp()->
addDisplay()->
create();
testOk1(ntMatrix.get() != 0);
testOk1(ntScalarArray.get() != 0);
testOk1(NTMatrix::is_a(ntMatrix->getPVStructure()));
testOk1(NTMatrix::isCompatible(ntMatrix->getPVStructure()));
testOk1(ntMatrix->getPVStructure().get() != 0);
testOk1(ntMatrix->getValue().get() != 0);
testOk1(ntMatrix->getDim().get() != 0);
testOk1(ntMatrix->getDescriptor().get() != 0);
testOk1(ntMatrix->getAlarm().get() != 0);
testOk1(ntMatrix->getTimeStamp().get() != 0);
testOk1(ntMatrix->getDisplay().get() != 0);
testOk1(ntScalarArray->getPVStructure().get() != 0);
testOk1(ntScalarArray->getValue().get() != 0);
testOk1(ntScalarArray->getDim().get() != 0);
testOk1(ntScalarArray->getDescriptor().get() != 0);
testOk1(ntScalarArray->getAlarm().get() != 0);
testOk1(ntScalarArray->getTimeStamp().get() != 0);
testOk1(ntScalarArray->getDisplay().get() != 0);
//
// example how to set values
@@ -86,7 +85,7 @@ void test_ntmatrix()
newValues.push_back(2.0);
newValues.push_back(8.0);
PVDoubleArrayPtr pvValueField = ntMatrix->getValue();
PVDoubleArrayPtr pvValueField = ntScalarArray->getValue();
pvValueField->replace(freeze(newValues));
//
@@ -103,7 +102,7 @@ void test_ntmatrix()
// timeStamp ops
//
PVTimeStamp pvTimeStamp;
if (ntMatrix->attachTimeStamp(pvTimeStamp))
if (ntScalarArray->attachTimeStamp(pvTimeStamp))
{
testPass("timeStamp attach");
@@ -124,7 +123,7 @@ void test_ntmatrix()
// alarm ops
//
PVAlarm pvAlarm;
if (ntMatrix->attachAlarm(pvAlarm))
if (ntScalarArray->attachAlarm(pvAlarm))
{
testPass("alarm attach");
@@ -142,7 +141,7 @@ void test_ntmatrix()
// display ops
//
PVDisplay pvDisplay;
if (ntMatrix->attachDisplay(pvDisplay))
if (ntScalarArray->attachDisplay(pvDisplay))
{
testPass("display attach");
@@ -161,10 +160,10 @@ void test_ntmatrix()
//
// set descriptor
//
ntMatrix->getDescriptor()->put("This is a test NTMatrix");
ntScalarArray->getDescriptor()->put("This is a test NTMatrix");
// dump ntMatrix
std::cout << *ntMatrix->getPVStructure() << std::endl;
// dump ntScalarArray
std::cout << *ntScalarArray->getPVStructure() << std::endl;
}
@@ -202,7 +201,7 @@ void test_wrap()
}
MAIN(testNTMatrix) {
testPlan(38);
testPlan(36);
test_builder();
test_ntmatrix();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
/*
* ntmutiChannelTest.cpp
@@ -53,9 +54,6 @@ static void test()
create();
testOk1(multiChannel.get() != 0);
testOk1(NTMultiChannel::is_a(multiChannel->getPVStructure()));
testOk1(NTMultiChannel::isCompatible(multiChannel->getPVStructure()));
PVStructurePtr pvStructure = multiChannel->getPVStructure();
testOk1(pvStructure.get()!=NULL);
testOk1(NTMultiChannel::is_a(pvStructure->getStructure()));
@@ -188,7 +186,7 @@ void test_wrap()
MAIN(testCreateRequest)
{
testPlan(27);
testPlan(25);
test();
test_wrap();
return testDone();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -80,9 +81,6 @@ void test_ntnameValue()
create();
testOk1(ntNameValue.get() != 0);
testOk1(NTNameValue::is_a(ntNameValue->getPVStructure()));
testOk1(NTNameValue::isCompatible(ntNameValue->getPVStructure()));
testOk1(ntNameValue->getPVStructure().get() != 0);
testOk1(ntNameValue->getDescriptor().get() != 0);
testOk1(ntNameValue->getAlarm().get() != 0);
@@ -247,7 +245,7 @@ void test_extra()
MAIN(testNTNameValue) {
testPlan(50);
testPlan(48);
test_builder();
test_ntnameValue();
test_wrap();

View File

@@ -1,6 +1,8 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*
*/
#include <epicsUnitTest.h>
#include <testMain.h>
@@ -74,9 +76,6 @@ void test_ntndarrayAttribute()
create();
testOk1(ntNDArrayAttribute.get() != 0);
testOk1(NTNDArrayAttribute::is_a(ntNDArrayAttribute->getPVStructure()));
testOk1(NTNDArrayAttribute::isCompatible(ntNDArrayAttribute->getPVStructure()));
testOk1(ntNDArrayAttribute->getPVStructure().get() != 0);
testOk1(ntNDArrayAttribute->getName().get() != 0);
testOk1(ntNDArrayAttribute->getValue().get() != 0);
@@ -169,7 +168,7 @@ void test_wrap()
}
MAIN(testNTNDArrayAttribute) {
testPlan(39);
testPlan(37);
test_builder();
test_ntndarrayAttribute();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -74,7 +75,7 @@ void test_all()
add("extra1",fieldCreate->createScalar(pvString)) ->
add("extra2",fieldCreate->createScalarArray(pvString)) ->
createPVStructure();
testOk1(NTNDArray::is_a(pvStructure)==true);
std::cout << *pvStructure << std::endl;
testOk1(NTNDArray::isCompatible(pvStructure)==true);
}
@@ -112,7 +113,7 @@ void test_wrap()
}
MAIN(testNTNDArray) {
testPlan(60);
testPlan(59);
test_builder(true);
test_builder(false);
test_builder(false); // called twice to test caching

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -22,7 +23,7 @@ void test_builder()
testOk(builder.get() != 0, "Got builder");
StructureConstPtr structure = builder->
value(pvDouble)->
arrayValue(pvDouble)->
addDescriptor()->
addAlarm()->
addTimeStamp()->
@@ -74,7 +75,7 @@ void test_ntscalarArray()
testOk(builder.get() != 0, "Got builder");
NTScalarArrayPtr ntScalarArray = builder->
value(pvInt)->
arrayValue(pvInt)->
addDescriptor()->
addAlarm()->
addTimeStamp()->
@@ -83,9 +84,6 @@ void test_ntscalarArray()
create();
testOk1(ntScalarArray.get() != 0);
testOk1(NTScalarArray::is_a(ntScalarArray->getPVStructure()));
testOk1(NTScalarArray::isCompatible(ntScalarArray->getPVStructure()));
testOk1(ntScalarArray->getPVStructure().get() != 0);
testOk1(ntScalarArray->getValue().get() != 0);
testOk1(ntScalarArray->getDescriptor().get() != 0);
@@ -222,7 +220,7 @@ void test_wrap()
testOk(builder.get() != 0, "Got builder");
PVStructurePtr pvStructure = builder->
value(pvDouble)->
arrayValue(pvDouble)->
createPVStructure();
testOk1(pvStructure.get() != 0);
if (!pvStructure)
@@ -237,7 +235,7 @@ void test_wrap()
}
MAIN(testNTScalarArray) {
testPlan(40);
testPlan(38);
test_builder();
test_ntscalarArray();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
/*
* ntscalarMultiChannelTest.cpp
@@ -53,9 +54,6 @@ static void test()
create();
testOk1(multiChannel.get() != 0);
testOk1(NTScalarMultiChannel::is_a(multiChannel->getPVStructure()));
testOk1(NTScalarMultiChannel::isCompatible(multiChannel->getPVStructure()));
PVStructurePtr pvStructure = multiChannel->getPVStructure();
testOk1(pvStructure.get()!=NULL);
testOk1(NTScalarMultiChannel::is_a(pvStructure->getStructure()));
@@ -175,7 +173,7 @@ void test_wrap()
MAIN(testCreateRequest)
{
testPlan(27);
testPlan(25);
test();
test_wrap();
return testDone();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -85,9 +86,6 @@ void test_ntscalar()
create();
testOk1(ntScalar.get() != 0);
testOk1(NTScalar::is_a(ntScalar->getPVStructure()));
testOk1(NTScalar::isCompatible(ntScalar->getPVStructure()));
testOk1(ntScalar->getPVStructure().get() != 0);
testOk1(ntScalar->getValue().get() != 0);
testOk1(ntScalar->getDescriptor().get() != 0);
@@ -228,7 +226,7 @@ void test_wrap()
}
MAIN(testNTScalar) {
testPlan(37);
testPlan(35);
test_builder();
test_ntscalar();
test_wrap();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -118,9 +119,6 @@ void test_nttable()
create();
testOk1(ntTable.get() != 0);
testOk1(NTTable::is_a(ntTable->getPVStructure()));
testOk1(NTTable::isCompatible(ntTable->getPVStructure()));
testOk1(ntTable->getPVStructure().get() != 0);
testOk1(ntTable->getDescriptor().get() != 0);
testOk1(ntTable->getAlarm().get() != 0);
@@ -238,7 +236,7 @@ void test_wrap()
}
MAIN(testNTTable) {
testPlan(50);
testPlan(48);
test_builder();
test_labels();
test_nttable();

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>
@@ -47,6 +48,7 @@ void test_builder()
testOk(valueField.get() != 0, "value is enum");
std::cout << *structure << std::endl;
}
void test_ntunion()
@@ -63,9 +65,6 @@ void test_ntunion()
create();
testOk1(ntUnion.get() != 0);
testOk1(NTUnion::is_a(ntUnion->getPVStructure()));
testOk1(NTUnion::isCompatible(ntUnion->getPVStructure()));
testOk1(ntUnion->getPVStructure().get() != 0);
testOk1(ntUnion->getValue().get() != 0);
testOk1(ntUnion->getDescriptor().get() != 0);
@@ -157,43 +156,11 @@ void test_wrap()
testOk(ptr.get() != 0, "wrapUnsafe OK");
}
void test_variant_union()
{
StructureConstPtr structure = NTUnion::createBuilder()->
addDescriptor()->
addAlarm()->
addTimeStamp()->
createStructure();
testOk1(structure->getField<Union>("value")->isVariant());
}
void test_regular_union()
{
UnionConstPtr u = getFieldCreate()->createFieldBuilder()->
add("x", pvDouble)->
add("i", pvInt)->
createUnion();
StructureConstPtr structure = NTUnion::createBuilder()->
value(u)->
addDescriptor()->
addAlarm()->
addTimeStamp()->
createStructure();
testOk1(!structure->getField<Union>("value")->isVariant());
testOk1(structure->getField<Union>("value") == u);
}
MAIN(testNTUnion) {
testPlan(32);
testPlan(27);
test_builder();
test_ntunion();
test_wrap();
test_variant_union();
test_regular_union();
return testDone();
}

View File

@@ -1,6 +1,7 @@
/*
* Copyright information and license terms for this software can be
* found in the file LICENSE that is included with the distribution
/**
* Copyright - See the COPYRIGHT that is included with this distribution.
* This software is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
*/
#include <epicsUnitTest.h>