pvDatabaseCPP  4.7.0
pvStructureCopy.h
Go to the documentation of this file.
1 /* pvStructureCopy.h */
2 /*
3  * Copyright information and license terms for this software can be
4  * found in the file LICENSE that is included with the distribution
5  */
10 #ifndef PVSTRUCTURECOPY_H
11 #define PVSTRUCTURECOPY_H
12 
13 #include <string>
14 #include <stdexcept>
15 #include <memory>
16 #include <pv/pvData.h>
17 #include <pv/bitSet.h>
18 
19 #include <shareLib.h>
20 
21 namespace epics { namespace pvCopy{
22 
24 typedef std::tr1::shared_ptr<PVCopyTraverseMasterCallback> PVCopyTraverseMasterCallbackPtr;
25 
36 class epicsShareClass PVCopyTraverseMasterCallback
37 {
38 public:
39  POINTER_DEFINITIONS(PVCopyTraverseMasterCallback);
45  virtual void nextMasterPVField(epics::pvData::PVFieldPtr const &pvField) = 0;
46 };
47 
48 
49 class PVCopy;
50 typedef std::tr1::shared_ptr<PVCopy> PVCopyPtr;
51 
52 struct CopyNode;
53 typedef std::tr1::shared_ptr<CopyNode> CopyNodePtr;
54 
55 struct CopyStructureNode;
56 typedef std::tr1::shared_ptr<CopyStructureNode> CopyStructureNodePtr;
57 
58 
65 class epicsShareClass PVCopy :
66  public std::tr1::enable_shared_from_this<PVCopy>
67 {
68 public:
69  POINTER_DEFINITIONS(PVCopy);
77  static PVCopyPtr create(
78  epics::pvData::PVStructurePtr const &pvMaster,
79  epics::pvData::PVStructurePtr const &pvRequest,
80  std::string const & structureName);
81  virtual ~PVCopy(){}
87  epics::pvData::PVStructurePtr getPVMaster();
92  void traverseMaster(PVCopyTraverseMasterCallbackPtr const & callback);
96  epics::pvData::StructureConstPtr getStructure();
101  epics::pvData::PVStructurePtr createPVStructure();
107  std::size_t getCopyOffset(epics::pvData::PVFieldPtr const &masterPVField);
114  std::size_t getCopyOffset(
115  epics::pvData::PVStructurePtr const &masterPVStructure,
116  epics::pvData::PVFieldPtr const &masterPVField);
121  epics::pvData::PVFieldPtr getMasterPVField(std::size_t structureOffset);
129  void initCopy(
130  epics::pvData::PVStructurePtr const &copyPVStructure,
131  epics::pvData::BitSetPtr const &bitSet);
139  bool updateCopySetBitSet(
140  epics::pvData::PVStructurePtr const &copyPVStructure,
141  epics::pvData::BitSetPtr const &bitSet);
149  bool updateCopyFromBitSet(
150  epics::pvData::PVStructurePtr const &copyPVStructure,
151  epics::pvData::BitSetPtr const &bitSet);
158  void updateMaster(
159  epics::pvData::PVStructurePtr const &copyPVStructure,
160  epics::pvData::BitSetPtr const &bitSet);
169  epics::pvData::PVStructurePtr getOptions(std::size_t fieldOffset);
173  std::string dump();
174 private:
175 
176  PVCopyPtr getPtrSelf()
177  {
178  return shared_from_this();
179  }
180 
181  epics::pvData::PVStructurePtr pvMaster;
182  epics::pvData::StructureConstPtr structure;
183  CopyNodePtr headNode;
184  epics::pvData::PVStructurePtr cacheInitStructure;
185  epics::pvData::BitSetPtr ignorechangeBitSet;
186 
187  void traverseMaster(
188  CopyNodePtr const &node,
189  PVCopyTraverseMasterCallbackPtr const & callback);
190  void updateCopySetBitSet(
191  epics::pvData::PVFieldPtr const &pvCopy,
192  epics::pvData::PVFieldPtr const &pvMaster,
193  epics::pvData::BitSetPtr const &bitSet);
194  void updateCopySetBitSet(
195  epics::pvData::PVFieldPtr const &pvCopy,
196  CopyNodePtr const &node,
197  epics::pvData::BitSetPtr const &bitSet);
198  void updateCopyFromBitSet(
199  epics::pvData::PVFieldPtr const &pvCopy,
200  CopyNodePtr const &node,
201  epics::pvData::BitSetPtr const &bitSet);
202  void updateMasterField(
203  CopyNodePtr const & node,
204  epics::pvData::PVFieldPtr const & pvCopy,
205  epics::pvData::PVFieldPtr const &pvMaster,
206  epics::pvData::BitSetPtr const &bitSet);
207  void updateMasterCheckBitSet(
208  epics::pvData::PVStructurePtr const &copyPVStructure,
209  epics::pvData::BitSetPtr const &bitSet,
210  size_t nextSet);
211  CopyNodePtr getCopyNode(std::size_t fieldOffset);
212 
213  PVCopy(epics::pvData::PVStructurePtr const &pvMaster);
214  bool init(epics::pvData::PVStructurePtr const &pvRequest);
215  epics::pvData::StructureConstPtr createStructure(
216  epics::pvData::PVStructurePtr const &pvMaster,
217  epics::pvData::PVStructurePtr const &pvFromRequest);
218  CopyNodePtr createStructureNodes(
219  epics::pvData::PVStructurePtr const &pvMasterStructure,
220  epics::pvData::PVStructurePtr const &pvFromRequest,
221  epics::pvData::PVStructurePtr const &pvFromField);
222  void initPlugin(
223  CopyNodePtr const & node,
224  epics::pvData::PVStructurePtr const & pvOptions,
225  epics::pvData::PVFieldPtr const & pvMasterField);
226  void traverseMasterInitPlugin();
227  void traverseMasterInitPlugin(CopyNodePtr const & node);
228 
229  CopyNodePtr getCopyOffset(
230  CopyStructureNodePtr const &structureNode,
231  epics::pvData::PVFieldPtr const &masterPVField);
232  bool checkIgnore(
233  epics::pvData::PVStructurePtr const & copyPVStructure,
234  epics::pvData::BitSetPtr const & bitSet);
235  void setIgnore(CopyNodePtr const & node);
236  CopyNodePtr getMasterNode(
237  CopyStructureNodePtr const &structureNode,
238  std::size_t structureOffset);
239  void dump(
240  std::string *builder,
241  CopyNodePtr const &node,
242  int indentLevel);
243 };
244 
245 }}
246 
247 #endif /* PVSTRUCTURECOPY_H */
std::tr1::shared_ptr< CopyStructureNode > CopyStructureNodePtr
std::tr1::shared_ptr< CopyNode > CopyNodePtr
std::tr1::shared_ptr< PVCopy > PVCopyPtr
Definition: pvPlugin.h:25
Support for subset of fields in a pvStructure.
std::tr1::shared_ptr< PVCopyTraverseMasterCallback > PVCopyTraverseMasterCallbackPtr
Callback for traversing master structure.