PLCnext API Documentation 23.6.0.37
ArrayNavigator.hpp
1
2//
3// Copyright PHOENIX CONTACT Electronics GmbH
4//
6#pragma once
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
15namespace Arp { namespace Plc { namespace Commons { namespace Meta
16{
17
18// Not documented because it shall be moved to internal namepsace
20class ArrayNavigator
21{
22public: // usings
23 using Ptr = std::shared_ptr<ArrayNavigator>;
24
25public: // Nested types
26
28 class Enumerator : public IEnumerator<const DataInfo&>
29 {
30 public: // construction
31 Enumerator(DataInfo& dataInfo, size_t count, size_t dataSize);
32
33 public: // overridden operations
34 bool MoveNext(void)override;
35 const DataInfo& GetCurrent(void)override;
36 size_t GetCurrentIndex(void)const;
37 size_t GetCurrentOffset(void)const;
38 const byte* GetCurrentAddress(void)const;
39
40 private: // fields
41 bool isFirstMove = true;
42 DataInfo& dataInfo;
43 size_t count = 0;
44 size_t dataSize = 0;
45 size_t index = 0;
46 };
47
49
50public: // construction/destruction
52 ArrayNavigator(const DataInfo& variableInfo, ITypeNavigator& typeNavigator);
53
54public: // operators
55
56public: // setter/getter operations
57 Enumerator GetEnumerator();
58 size_t GetElementDataSize(void)const;
59
60public: // operations (convinience)
61 size_t GetOffset(size_t index);
62 const byte* GetAddress(size_t index);
63
64private: // methods
65
66private: // fields
67 size_t elementDataSize = 0;
68 DataInfo dataInfo;
69 ITypeNavigator& typeNavigator;
70 const byte* startAddress = nullptr;
71 bool isChanging = false;
72};
73
75// inline methods of class ArrayNavigator
76inline size_t ArrayNavigator::GetOffset(size_t index)
77{
78 return index * this->elementDataSize;
79}
80
81inline const byte* ArrayNavigator::GetAddress(size_t index)
82{
83 return this->startAddress + this->GetOffset(index);
84}
85
87// inline methods of class ArrayNavigator::Enumerator
88
90{
91 return this->dataInfo;
92}
93
94inline size_t ArrayNavigator::Enumerator::GetCurrentIndex(void)const
95{
96 return this->index;
97}
98
99inline size_t ArrayNavigator::Enumerator::GetCurrentOffset(void)const
100{
101 return index * this->dataSize;
102}
103
104inline const byte* ArrayNavigator::Enumerator::GetCurrentAddress(void)const
105{
106 return this->dataInfo.GetDataTag().GetDataAddress();
107}
108
109inline size_t ArrayNavigator::GetElementDataSize(void)const
110{
111 return this->elementDataSize;
112}
113
114
115}}}} // end of namespace Arp::Plc::Commons::Meta
Declares the interface of the enumerator pattern, which is leaned on .NET enumerator idiom.
Definition: IEnumerator.hxx:48
bool MoveNext(void) override
Moves this enumerator to the next position.
const DataInfo & GetCurrent(void) override
Gets the element at the current position.
Definition: ArrayNavigator.hpp:89
Provides detailed informations for the respective data object.
Definition: DataInfo.hpp:32
DataTag & GetDataTag(void)
Gets the DataTag .
Definition: DataInfo.hpp:183
const byte * GetDataAddress(void) const
For internal use only.
Definition: DataTag.hpp:203
Provide type information
Definition: ITypeNavigator.hpp:19
Root namespace for the PLCnext API