PLCnext API Documentation  22.9.0.33
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;
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 
69  size_t GetDimensionsProduct(void)const;
70 
71 public: // operations
72  void Append(const ArrayDimension& dimension);
73 
74 protected: // setter/getter operations
75  void EraseFrontDimension(void);
76 
77 private: // fields
78  Values values;
79 };
80 
82 // inline methods of class ArrayDimensions
84  : values(count)
85 {
86 }
87 
89  : values(1, entry)
90 {
91 }
92 
93 inline ArrayDimensions::ArrayDimensions(const Values& values)
94  : values(values)
95 {
96 }
97 
98 inline ArrayDimension& ArrayDimensions::operator[](size_t index)
99 {
100  return this->values[index];
101 }
102 
103 inline const ArrayDimension& ArrayDimensions::operator[](size_t index)const
104 {
105  return this->values[index];
106 }
107 
108 inline bool ArrayDimensions::IsEmpty()const
109 {
110  return this->values.empty();
111 }
112 
113 inline size_t ArrayDimensions::GetCount()const
114 {
115  return this->values.size();
116 }
117 
118 inline const ArrayDimensions::Values& ArrayDimensions::GetValues()const
119 {
120  return this->values;
121 }
122 
123 inline void ArrayDimensions::EraseFrontDimension(void)
124 {
125  if (this->values.size() > 0)
126  {
127  this->values.erase(this->values.begin());
128  }
129 }
130 
131 inline void ArrayDimensions::Append(const ArrayDimension& dimension)
132 {
133  this->values.push_back(dimension);
134 }
135 
136 inline size_t ArrayDimensions::GetCacheSize(void)const
137 {
138  return this->values.size() * ArrayDimension::GetCacheSize();
139 }
140 
141 inline bool operator==(const ArrayDimensions& lhs, const ArrayDimensions& rhs)
142 {
143  return (lhs.GetCount() == rhs.GetCount()) &&
144  std::equal(lhs.GetValues().begin(), lhs.GetValues().end(), rhs.GetValues().begin());
145 }
146 
147 inline bool operator!= (const ArrayDimensions& lhs, const ArrayDimensions& rhs)
148 {
149  return !(lhs == rhs);
150 }
151 
152 inline std::ostream& operator<<(std::ostream& os, const ArrayDimensions& rhs)
153 {
154  if (rhs.GetCount() == 0)
155  {
156  os << "{}";
157  }
158  else
159  {
160  os << "{" << rhs[0];
161  const auto count = rhs.GetCount();
162  for (size_t i = 1; i < count; ++i)
163  {
164  os << ";" << rhs[i];
165  }
166  os << "}";
167  }
168  return os;
169 }
170 
171 }}}} // end of namespace Arp::Plc::Commons::Meta
172 
Provide array information.
Definition: ArrayDimension.hpp:21
static size_t GetCacheSize(void)
Get the cache size
Definition: ArrayDimension.hpp:92
Provide array information.
Definition: ArrayDimensions.hpp:18
ArrayDimensions(const ArrayDimensions &arg)=default
Copy constructor.
size_t GetCacheSize(void) const
Get the cache size
Definition: ArrayDimensions.hpp:136
ArrayDimensions & operator=(ArrayDimensions &&arg)=default
Move assignment operator.
size_t GetCount(void) const
Get the number of array dimensions for this vector element.
Definition: ArrayDimensions.hpp:113
~ArrayDimensions(void)=default
Destructs this instance and frees all resources.
ArrayDimensions(void)=default
Constructs an ArrayDimension instance.
ArrayDimensions(const std::initializer_list< int > &dimensions)
Constructs an ArrayDimension instance.
ArrayDimensions(const std::initializer_list< ArrayDimension > &entries)
Constructs an ArrayDimension instance.
ArrayDimensions(ArrayDimensions &&arg)=default
Move constructor.
ArrayDimensions & operator=(const ArrayDimensions &arg)=default
Copy assignment operator.
size_t GetDimensionsProduct(void) const
Gets the element count total.
std::ostream & operator<<(std::ostream &os, const BasicString< CharType, Alloc > &right)
Streams the right string to the outstream os .
Definition: BasicString.hxx:1708
bool operator!=(const BasicString< CharType, Alloc > &left, const BasicString< CharType, Alloc > &right)
Compares the left string to the right string on inequality.
Definition: BasicString.hxx:1912
bool operator==(const BasicString< CharType, Alloc > &left, const BasicString< CharType, Alloc > &right)
Compares the left string to the right string on equality.
Definition: BasicString.hxx:1876
Root namespace for the PLCnext API