This is Unofficial EPICS BASE Doxygen Site
epics::nt::detail::NTNDArrayBuilder Class Reference

Interface for in-line creating of NTNDArray. More...

#include "ntndarray.h"

+ Inheritance diagram for epics::nt::detail::NTNDArrayBuilder:
+ Collaboration diagram for epics::nt::detail::NTNDArrayBuilder:

Public Member Functions

 POINTER_DEFINITIONS (NTNDArrayBuilder)
 
shared_pointer addDescriptor ()
 
shared_pointer addAlarm ()
 
shared_pointer addTimeStamp ()
 
shared_pointer addDisplay ()
 
epics::pvData::StructureConstPtr createStructure ()
 
epics::pvData::PVStructurePtr createPVStructure ()
 
NTNDArrayPtr create ()
 
shared_pointer add (std::string const &name, epics::pvData::FieldConstPtr const &field)
 

Friends

class ::epics::nt::NTNDArray
 

Detailed Description

Interface for in-line creating of 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
mse

Definition at line 43 of file ntndarray.h.

Member Function Documentation

NTNDArrayBuilder::shared_pointer epics::nt::detail::NTNDArrayBuilder::add ( std::string const &  name,
epics::pvData::FieldConstPtr const &  field 
)

Adds extra Field to the type.

Parameters
namethe name of the field.
fieldthe field to be added.
Returns
this instance of a NTArrayBuilder.

Definition at line 189 of file ntndarray.cpp.

190 {
191  extraFields.push_back(field); extraFieldNames.push_back(name);
192  return shared_from_this();
193 }
NTNDArrayBuilder::shared_pointer epics::nt::detail::NTNDArrayBuilder::addAlarm ( )

Adds alarm field to the NTNDArray.

Returns
this instance of NTNDArrayBuilder.

Definition at line 146 of file ntndarray.cpp.

147 {
148  alarm = true;
149  return shared_from_this();
150 }
NTNDArrayBuilder::shared_pointer epics::nt::detail::NTNDArrayBuilder::addDescriptor ( )

Adds descriptor field to the NTNDArray.

Returns
this instance of NTNDArrayBuilder.

Definition at line 140 of file ntndarray.cpp.

141 {
142  descriptor = true;
143  return shared_from_this();
144 }
NTNDArrayBuilder::shared_pointer epics::nt::detail::NTNDArrayBuilder::addDisplay ( )

Adds display field to the NTNDArray.

Returns
this instance of NTNDArrayBuilder.

Definition at line 158 of file ntndarray.cpp.

159 {
160  display = true;
161  return shared_from_this();
162 }
NTNDArrayBuilder::shared_pointer epics::nt::detail::NTNDArrayBuilder::addTimeStamp ( )

Adds timeStamp field to the NTNDArray.

Returns
this instance of NTNDArrayBuilder.

Definition at line 152 of file ntndarray.cpp.

153 {
154  timeStamp = true;
155  return shared_from_this();
156 }
NTNDArrayPtr epics::nt::detail::NTNDArrayBuilder::create ( )

Creates a NTNDArray instance. This resets this instance state and allows new instance to be created.

Returns
a new instance of a NTNDArray

Definition at line 169 of file ntndarray.cpp.

170 {
171  return NTNDArrayPtr(new NTNDArray(createPVStructure()));
172 }
epics::pvData::PVStructurePtr createPVStructure()
Definition: ntndarray.cpp:164
std::tr1::shared_ptr< NTNDArray > NTNDArrayPtr
Definition: ntndarray.h:31
PVStructurePtr epics::nt::detail::NTNDArrayBuilder::createPVStructure ( )

Creates a PVStructure that represents NTNDArray. This resets this instance state and allows new instance to be created.

Returns
a new instance of a PVStructure

Definition at line 164 of file ntndarray.cpp.

165 {
166  return getPVDataCreate()->createPVStructure(createStructure());
167 }
epics::pvData::StructureConstPtr createStructure()
Definition: ntndarray.cpp:31
FORCE_INLINE const PVDataCreatePtr & getPVDataCreate()
Definition: pvData.h:1648
StructureConstPtr epics::nt::detail::NTNDArrayBuilder::createStructure ( )

Creates a Structure that represents NTNDArray. This resets this instance state and allows new instance to be created.

Returns
a new instance of a Structure.

Definition at line 31 of file ntndarray.cpp.

32 {
33  enum
34  {
35  DISCRIPTOR_INDEX,
36  TIMESTAMP_INDEX,
37  ALARM_INDEX,
38  DISPLAY_INDEX
39  };
40 
41  const size_t NUMBER_OF_INDICES = DISPLAY_INDEX+1;
42  const size_t NUMBER_OF_STRUCTURES = 1 << NUMBER_OF_INDICES;
43 
44  Lock xx(mutex);
45 
46  static StructureConstPtr ntndarrayStruc[NUMBER_OF_STRUCTURES];
47  static UnionConstPtr valueType;
48  static StructureConstPtr codecStruc;
49  static StructureConstPtr dimensionStruc;
50  static StructureConstPtr attributeStruc;
51 
52  StructureConstPtr returnedStruc;
53 
54  size_t index = 0;
55  if (descriptor) index |= 1 << DISCRIPTOR_INDEX;
56  if (timeStamp) index |= 1 << TIMESTAMP_INDEX;
57  if (alarm) index |= 1 << ALARM_INDEX;
58  if (display) index |= 1 << DISPLAY_INDEX;
59 
60  bool isExtended = !extraFieldNames.empty();
61 
62  if (isExtended || !ntndarrayStruc[index])
63  {
64  StandardFieldPtr standardField = getStandardField();
65  FieldBuilderPtr fb = fieldCreate->createFieldBuilder();
66 
67  if (!valueType)
68  {
69  for (int i = pvBoolean; i < pvString; ++i)
70  {
71  ScalarType st = static_cast<ScalarType>(i);
72  fb->addArray(std::string(ScalarTypeFunc::name(st)) + "Value", st);
73  }
74  valueType = fb->createUnion();
75  }
76 
77  if (!codecStruc)
78  {
79  codecStruc = fb->setId("codec_t")->
80  add("name", pvString)->
81  add("parameters", fieldCreate->createVariantUnion())->
83  }
84 
85  if (!dimensionStruc)
86  {
87  dimensionStruc = fb->setId("dimension_t")->
88  add("size", pvInt)->
89  add("offset", pvInt)->
90  add("fullSize", pvInt)->
91  add("binning", pvInt)->
92  add("reverse", pvBoolean)->
94  }
95 
96  if (!attributeStruc)
97  {
98  attributeStruc = NTNDArrayAttribute::createBuilder()->createStructure();
99  }
100 
101  fb->setId(NTNDArray::URI)->
102  add("value", valueType)->
103  add("codec", codecStruc)->
104  add("compressedSize", pvLong)->
105  add("uncompressedSize", pvLong)->
106  addArray("dimension", dimensionStruc)->
107  add("uniqueId", pvInt)->
108  add("dataTimeStamp", standardField->timeStamp())->
109  addArray("attribute", attributeStruc);
110 
111  if (descriptor)
112  fb->add("descriptor", pvString);
113 
114  if (alarm)
115  fb->add("alarm", standardField->alarm());
116 
117  if (timeStamp)
118  fb->add("timeStamp", standardField->timeStamp());
119 
120  if (display)
121  fb->add("display", standardField->display());
122 
123  size_t extraCount = extraFieldNames.size();
124  for (size_t i = 0; i< extraCount; i++)
125  fb->add(extraFieldNames[i], extraFields[i]);
126 
127  returnedStruc = fb->createStructure();
128 
129  if (!isExtended)
130  ntndarrayStruc[index] = returnedStruc;
131  }
132  else
133  {
134  return ntndarrayStruc[index];
135  }
136 
137  return returnedStruc;
138 }
static NTNDArrayAttributeBuilderPtr createBuilder()
int i
Definition: scan.c:967
std::tr1::shared_ptr< const Structure > StructureConstPtr
Definition: pvIntrospect.h:162
A lock for multithreading.
Definition: lock.h:36
std::tr1::shared_ptr< FieldBuilder > FieldBuilderPtr
std::tr1::shared_ptr< StandardField > StandardFieldPtr
Definition: standardField.h:22
FORCE_INLINE const StandardFieldPtr & getStandardField()
std::tr1::shared_ptr< const Union > UnionConstPtr
Definition: pvIntrospect.h:170
shared_pointer add(std::string const &name, epics::pvData::FieldConstPtr const &field)
Definition: ntndarray.cpp:189
static const std::string URI
Definition: ntndarray.h:133
epics::pvData::StructureConstPtr createStructure()
Definition: ntndarray.cpp:31
epics::nt::detail::NTNDArrayBuilder::POINTER_DEFINITIONS ( NTNDArrayBuilder  )

Friends And Related Function Documentation

friend class ::epics::nt::NTNDArray
friend

Definition at line 116 of file ntndarray.h.


The documentation for this class was generated from the following files: