PLCnext API Documentation  20.0.0.24462
ArrayDimensions.hpp
1 //
3 // Copyright PHOENIX CONTACT Electronics GmbH
4 //
6 #pragma once
7 #include "Arp/System/Core/Arp.h"
8 #include "Arp/Plc/Commons/Meta/ArrayDimension.hpp"
9 #include <vector>
10 #include <algorithm>
11 #include <initializer_list>
12 
13 namespace Arp { namespace Plc { namespace Commons { namespace Meta
14 {
15 
18 {
19  friend class ArrayNavigator;
20 
21 public: // typedefs
22  using Values = std::vector<ArrayDimension>;
23 
24 public: // construction/destruction
26  ArrayDimensions(void) = default;
28  explicit ArrayDimensions(size_t count);
30  ArrayDimensions(const ArrayDimension& entry);
32  ArrayDimensions(const Values& values);
34  ArrayDimensions(const std::initializer_list<int>& dimensions);
36  ArrayDimensions(const std::initializer_list<ArrayDimension>& entries);
38  ArrayDimensions(const ArrayDimensions& arg) = default;
40  ArrayDimensions(ArrayDimensions&& arg) = default;
42  ArrayDimensions& operator=(const ArrayDimensions& arg) = default;
44  ArrayDimensions& operator=(ArrayDimensions&& arg) = default;
46  ~ArrayDimensions(void) = default;
47 
48 public: // static properties
49  static const ArrayDimensions Empty;
50 
51 public: // operators
52  ArrayDimension& operator[](size_t index);
53  const ArrayDimension& operator[](size_t index)const;
54 
55 public: // setter/getter operations
56  bool IsEmpty(void)const;
57 
60  size_t GetCount(void)const;
61  const Values& GetValues(void)const;
62 
65  size_t GetCacheSize(void)const;
66 
67 public: // operations
68  void Append(const ArrayDimension& dimension);
69 
70 protected: // setter/getter operations
71  void EraseFrontDimension(void);
72 
73 private: // fields
74  Values values;
75 };
76 
78 // inline methods of class ArrayDimensions
80  : values(count)
81 {
82 }
83 
85  : values(1, entry)
86 {
87 }
88 
89 inline ArrayDimensions::ArrayDimensions(const Values& values)
90  : values(values)
91 {
92 }
93 
94 inline ArrayDimension& ArrayDimensions::operator[](size_t index)
95 {
96  return this->values[index];
97 }
98 
99 inline const ArrayDimension& ArrayDimensions::operator[](size_t index)const
100 {
101  return this->values[index];
102 }
103 
104 inline bool ArrayDimensions::IsEmpty()const
105 {
106  return this->values.empty();
107 }
108 
109 inline size_t ArrayDimensions::GetCount()const
110 {
111  return this->values.size();
112 }
113 
114 inline const ArrayDimensions::Values& ArrayDimensions::GetValues()const
115 {
116  return this->values;
117 }
118 
119 inline void ArrayDimensions::EraseFrontDimension(void)
120 {
121  if (this->values.size() > 0)
122  {
123  this->values.erase(this->values.begin());
124  }
125 }
126 
127 inline void ArrayDimensions::Append(const ArrayDimension& dimension)
128 {
129  this->values.push_back(dimension);
130 }
131 
132 inline size_t ArrayDimensions::GetCacheSize(void)const
133 {
134  return this->values.size() * ArrayDimension::GetCacheSize();
135 }
136 
137 inline bool operator==(const ArrayDimensions& lhs, const ArrayDimensions& rhs)
138 {
139  return lhs.GetCount() == rhs.GetCount() &&
140  std::equal(lhs.GetValues().begin(), lhs.GetValues().end(), rhs.GetValues().begin());
141 }
142 
143 inline bool operator!= (const ArrayDimensions& lhs, const ArrayDimensions& rhs)
144 {
145  return !(lhs == rhs);
146 }
147 
148 inline std::ostream& operator<<(std::ostream& os, const ArrayDimensions& rhs)
149 {
150  if (rhs.GetCount() == 0)
151  {
152  os << "{}";
153  }
154  else
155  {
156  os << "{" << rhs[0];
157  for (size_t i = 1; i < rhs.GetCount(); ++i)
158  {
159  os << ";" << rhs[i];
160  }
161  os << "}";
162  }
163  return os;
164 }
165 
166 }}}} // end of namespace Arp::Plc::Commons::Meta
167 
ArrayDimensions & operator=(const ArrayDimensions &arg)=default
Copy assignment operator.
Provide array information.
Definition: ArrayDimensions.hpp:17
Definition: ArrayNavigator.hpp:18
static size_t GetCacheSize(void)
Get the cache size
Definition: ArrayDimension.hpp:92
Root namespace for the PLCnext API
std::ostream & operator<<(std::ostream &os, Enum< T > value)
Makes the Enum class loggable and streamable.
Definition: Enum.hxx:208
Provide array information.
Definition: ArrayDimension.hpp:20
bool operator==(Enum< T > lhs, Enum< T > rhs)
Equality operator for class Enum.
Definition: Enum.hxx:218
size_t GetCacheSize(void) const
Get the cache size
Definition: ArrayDimensions.hpp:132
ArrayDimensions(void)=default
Constructs an ArrayDimension instance.
~ArrayDimensions(void)=default
Destructs this instance and frees all resources.
size_t GetCount(void) const
Get the number of array dimensions for this vector element.
Definition: ArrayDimensions.hpp:109