PLCnext API Documentation  20.6.0.30321
ArrayNavigator.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
8 #include "Arp/System/Core/IEnumerator.hxx"
9 #include "Arp/Plc/Commons/Meta/DataInfo.hpp"
10 #include "Arp/Plc/Commons/Meta/TypeInfo.hpp"
11 #include "Arp/Plc/Commons/Meta/ITypeNavigator.hpp"
12 
13 //TODO(OR): move to Arp/Plc/Commons/Internal/Meta
14 
15 namespace Arp { namespace Plc { namespace Commons { namespace Meta
16 {
17 
19 {
20 public: // typedefs
21  typedef std::shared_ptr<ArrayNavigator> Ptr;
22 
23 public: // Nested types
24 
26  class Enumerator : public IEnumerator<const DataInfo&>
27  {
28  public: // construction
29  Enumerator(DataInfo& dataInfo, size_t count, size_t dataSize);
30 
31  public: // overridden operations
32  bool MoveNext(void)override;
33  const DataInfo& GetCurrent(void)override;
34  size_t GetCurrentIndex(void)const;
35  size_t GetCurrentOffset(void)const;
36  const byte* GetCurrentAddress(void)const;
37 
38  private: // fields
39  bool isFirstMove = true;
40  DataInfo& dataInfo;
41  size_t count = 0;
42  size_t dataSize = 0;
43  size_t index = 0;
44  };
45 
47 
48 public: // construction/destruction
50  ArrayNavigator(const DataInfo& variableInfo, ITypeNavigator& typeNavigator);
51 
52 public: // operators
53 
54 public: // setter/getter operations
55  Enumerator GetEnumerator();
56  size_t GetElementDataSize(void)const;
57 
58 public: // operations (convinience)
59  size_t GetOffset(size_t index);
60  const byte* GetAddress(size_t index);
61 
62 private: // methods
63 
64 private: // fields
65  size_t elementDataSize = 0;
66  DataInfo dataInfo;
67  ITypeNavigator& typeNavigator;
68  const byte* startAddress = nullptr;
69  bool isChanging = false;
70 };
71 
73 // inline methods of class ArrayNavigator
74 inline size_t ArrayNavigator::GetOffset(size_t index)
75 {
76  return index * this->elementDataSize;
77 }
78 
79 inline const byte* ArrayNavigator::GetAddress(size_t index)
80 {
81  return this->startAddress + this->GetOffset(index);
82 }
83 
85 // inline methods of class ArrayNavigator::Enumerator
86 
88 {
89  return this->dataInfo;
90 }
91 
92 inline size_t ArrayNavigator::Enumerator::GetCurrentIndex(void)const
93 {
94  return this->index;
95 }
96 
97 inline size_t ArrayNavigator::Enumerator::GetCurrentOffset(void)const
98 {
99  return index * this->dataSize;
100 }
101 
102 inline const byte* ArrayNavigator::Enumerator::GetCurrentAddress(void)const
103 {
104  return this->dataInfo.GetDataTag().GetDataAddress();
105 }
106 
107 inline size_t ArrayNavigator::GetElementDataSize(void)const
108 {
109  return this->elementDataSize;
110 }
111 
112 
113 }}}} // end of namespace Arp::Plc::Commons::Meta
DataTag & GetDataTag(void)
Gets the DataTag .
Definition: DataInfo.hpp:144
Declares the interface of the enumerator pattern, which is leaned on .NET enumerator idiom...
Definition: IEnumerator.hxx:47
const byte * GetDataAddress(void) const
For internal use only.
Definition: DataTag.hpp:194
Definition: ArrayNavigator.hpp:18
Root namespace for the PLCnext API
ArrayNavigator(const DataInfo &variableInfo, ITypeNavigator &typeNavigator)
Constructs an ArrayNavigator instance.
Provides detailed informations for the respective data object.
Definition: DataInfo.hpp:31
const DataInfo & GetCurrent(void) override
Gets the element at the current position.
Definition: ArrayNavigator.hpp:87
Definition: ITypeNavigator.hpp:16
bool MoveNext(void) override
Moves this enumerator to the next position.
unsigned char byte
The Arp character type.
Definition: PrimitiveTypes.hpp:23