@@ -85,33 +85,43 @@ namespace ETP_NS
8585 auto dataArray = msg.dataArrays .begin ()->second ;
8686 if (dataArray.data .item .idx () == 0 ) {
8787 const Energistics::Etp::v12::Datatypes::ArrayOfBoolean& avroArray = dataArray.data .item .get_ArrayOfBoolean ();
88- for (size_t i = 0 ; i < avroArray.values .size (); ++i) {
89- values[i] = avroArray.values [i];
90- }
88+ std::transform (
89+ avroArray.values .begin (), avroArray.values .end (),
90+ values,
91+ [](const auto & x) { return static_cast <T>(x); }
92+ );
9193 }
9294 else if (dataArray.data .item .idx () == 1 ) {
9395 const Energistics::Etp::v12::Datatypes::ArrayOfInt& avroArray = dataArray.data .item .get_ArrayOfInt ();
94- for (size_t i = 0 ; i < avroArray.values .size (); ++i) {
95- values[i] = avroArray.values [i];
96- }
96+ std::transform (
97+ avroArray.values .begin (), avroArray.values .end (),
98+ values,
99+ [](const auto & x) { return static_cast <T>(x); }
100+ );
97101 }
98102 else if (dataArray.data .item .idx () == 2 ) {
99103 const Energistics::Etp::v12::Datatypes::ArrayOfLong& avroArray = dataArray.data .item .get_ArrayOfLong ();
100- for (size_t i = 0 ; i < avroArray.values .size (); ++i) {
101- values[i] = avroArray.values [i];
102- }
104+ std::transform (
105+ avroArray.values .begin (), avroArray.values .end (),
106+ values,
107+ [](const auto & x) { return static_cast <T>(x); }
108+ );
103109 }
104110 else if (dataArray.data .item .idx () == 3 ) {
105111 const Energistics::Etp::v12::Datatypes::ArrayOfFloat& avroArray = dataArray.data .item .get_ArrayOfFloat ();
106- for (size_t i = 0 ; i < avroArray.values .size (); ++i) {
107- values[i] = avroArray.values [i];
108- }
112+ std::transform (
113+ avroArray.values .begin (), avroArray.values .end (),
114+ values,
115+ [](const auto & x) { return static_cast <T>(x); }
116+ );
109117 }
110118 else if (dataArray.data .item .idx () == 4 ) {
111119 const Energistics::Etp::v12::Datatypes::ArrayOfDouble& avroArray = dataArray.data .item .get_ArrayOfDouble ();
112- for (size_t i = 0 ; i < avroArray.values .size (); ++i) {
113- values[i] = avroArray.values [i];
114- }
120+ std::transform (
121+ avroArray.values .begin (), avroArray.values .end (),
122+ values,
123+ [](const auto & x) { return static_cast <T>(x); }
124+ );
115125 }
116126 /*
117127 else if (dataArray.data.item.idx() == 5) {
@@ -123,9 +133,11 @@ namespace ETP_NS
123133 */
124134 else if (dataArray.data .item .idx () == 6 ) {
125135 const std::string& avroValues = dataArray.data .item .get_bytes ();
126- for (size_t i = 0 ; i < avroValues.size (); ++i) {
127- values[i] = avroValues[i];
128- }
136+ std::transform (
137+ avroValues.begin (), avroValues.end (),
138+ values,
139+ [](const auto & x) { return static_cast <T>(x); }
140+ );
129141 }
130142 }
131143 else {
@@ -142,54 +154,63 @@ namespace ETP_NS
142154 }
143155
144156 auto dataArray = receivedKeyValue.second ;
145- size_t dataArrayValueCount = iterator->second .counts [0 ];
146- for (size_t dimIndex = 1 ; dimIndex < iterator->second .counts .size (); ++dimIndex) {
147- dataArrayValueCount *= iterator->second .counts [dimIndex];
148- }
157+ int64_t dataArrayValueCount = std::accumulate (iterator->second .counts .begin (), iterator->second .counts .end (), 1 , std::multiplies<int64_t >());
149158 auto currentStarts = iterator->second .starts ;
150159
151- size_t subarrayOffset = 0 ;
160+ int64_t subarrayOffset = 0 ;
152161 while (subarrayOffset < dataArrayValueCount) {
153162 // Compute the offset in the receiving array
154- size_t arrayOffset = currentStarts.back ();
163+ int64_t arrayOffset = currentStarts.back ();
155164 for (int64_t dimIndex = iterator->second .counts .size () - 2 ; dimIndex >= 0 ; --dimIndex) {
156- size_t multiplier = iterator->second .counts [dimIndex + 1 ];
157- for (size_t dimIndex2 = dimIndex + 2 ; dimIndex2 < iterator->second .counts .size (); ++dimIndex2) {
158- multiplier *= iterator->second .counts [dimIndex2];
159- }
165+ int64_t multiplier = std::accumulate (iterator->second .counts .begin () + dimIndex + 1 , iterator->second .counts .end (), 1 , std::multiplies<int64_t >());
160166 arrayOffset += currentStarts[dimIndex] * multiplier;
161167 }
162168
163169 // Copy from the ETP subarray to the receiving array
164170 if (dataArray.data .item .idx () == 0 ) {
165171 const Energistics::Etp::v12::Datatypes::ArrayOfBoolean& avroArray = dataArray.data .item .get_ArrayOfBoolean ();
166- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
167- values[i + arrayOffset] = avroArray.values [i + subarrayOffset];
168- }
172+ std::transform (
173+ avroArray.values .begin () + subarrayOffset,
174+ avroArray.values .begin () + subarrayOffset + iterator->second .counts .back (),
175+ values + arrayOffset,
176+ [](const auto & x) { return static_cast <T>(x); }
177+ );
169178 }
170179 else if (dataArray.data .item .idx () == 1 ) {
171180 const Energistics::Etp::v12::Datatypes::ArrayOfInt& avroArray = dataArray.data .item .get_ArrayOfInt ();
172- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
173- values[i + arrayOffset] = avroArray.values [i + subarrayOffset];
174- }
181+ std::transform (
182+ avroArray.values .begin () + subarrayOffset,
183+ avroArray.values .begin () + subarrayOffset + iterator->second .counts .back (),
184+ values + arrayOffset,
185+ [](const auto & x) { return static_cast <T>(x); }
186+ );
175187 }
176188 else if (dataArray.data .item .idx () == 2 ) {
177189 const Energistics::Etp::v12::Datatypes::ArrayOfLong& avroArray = dataArray.data .item .get_ArrayOfLong ();
178- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
179- values[i + arrayOffset] = avroArray.values [i + subarrayOffset];
180- }
190+ std::transform (
191+ avroArray.values .begin () + subarrayOffset,
192+ avroArray.values .begin () + subarrayOffset + iterator->second .counts .back (),
193+ values + arrayOffset,
194+ [](const auto & x) { return static_cast <T>(x); }
195+ );
181196 }
182197 else if (dataArray.data .item .idx () == 3 ) {
183198 const Energistics::Etp::v12::Datatypes::ArrayOfFloat& avroArray = dataArray.data .item .get_ArrayOfFloat ();
184- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
185- values[i + arrayOffset] = avroArray.values [i + subarrayOffset];
186- }
199+ std::transform (
200+ avroArray.values .begin () + subarrayOffset,
201+ avroArray.values .begin () + subarrayOffset + iterator->second .counts .back (),
202+ values + arrayOffset,
203+ [](const auto & x) { return static_cast <T>(x); }
204+ );
187205 }
188206 else if (dataArray.data .item .idx () == 4 ) {
189207 const Energistics::Etp::v12::Datatypes::ArrayOfDouble& avroArray = dataArray.data .item .get_ArrayOfDouble ();
190- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
191- values[i + arrayOffset] = avroArray.values [i + subarrayOffset];
192- }
208+ std::transform (
209+ avroArray.values .begin () + subarrayOffset,
210+ avroArray.values .begin () + subarrayOffset + iterator->second .counts .back (),
211+ values + arrayOffset,
212+ [](const auto & x) { return static_cast <T>(x); }
213+ );
193214 }
194215 /*
195216 else if (dataArray.data.item.idx() == 5) {
@@ -201,9 +222,12 @@ namespace ETP_NS
201222 */
202223 else if (dataArray.data .item .idx () == 6 ) {
203224 const std::string& avroValues = dataArray.data .item .get_bytes ();
204- for (auto i = 0 ; i < iterator->second .counts .back (); ++i) {
205- values[i + arrayOffset] = avroValues[i + subarrayOffset];
206- }
225+ std::transform (
226+ avroValues.begin () + subarrayOffset,
227+ avroValues.begin () + subarrayOffset + iterator->second .counts .back (),
228+ values + arrayOffset,
229+ [](const auto & x) { return static_cast <T>(x); }
230+ );
207231 }
208232
209233 // Compute the new starts in the ETP subarray
0 commit comments