Arcane  4.1.12.0
User documentation
Loading...
Searching...
No Matches
ArrayConverter.h
1// -*- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature -*-
2//-----------------------------------------------------------------------------
3// Copyright 2000-2026 CEA (www.cea.fr) IFPEN (www.ifpenergiesnouvelles.com)
4// See the top-level COPYRIGHT file for details.
5// SPDX-License-Identifier: Apache-2.0
6//-----------------------------------------------------------------------------
7/*---------------------------------------------------------------------------*/
8/* ArrayConverter.h (C) 2000-2023 */
9/* */
10/* Conversion of an array from one type to another type. */
11/*---------------------------------------------------------------------------*/
12#ifndef ARCANE_UTILS_ARRAYCONVERTER_H
13#define ARCANE_UTILS_ARRAYCONVERTER_H
14/*---------------------------------------------------------------------------*/
15/*---------------------------------------------------------------------------*/
16
17#include "arcane/utils/Array.h"
18
19/*---------------------------------------------------------------------------*/
20/*---------------------------------------------------------------------------*/
21
22namespace Arcane
23{
24
25/*---------------------------------------------------------------------------*/
26/*---------------------------------------------------------------------------*/
27
28template <typename TypeA, typename TypeB>
30{
31 public:
32
33 void convertFromAToB(ConstArrayView<TypeA> input, ArrayView<TypeB> output)
34 {
35 for (Integer i = 0, is = input.size(); i < is; ++i)
36 output[i] = (TypeB)input[i];
37 }
38 void convertFromBToA(ConstArrayView<TypeB> input, ArrayView<TypeA> output)
39 {
40 for (Integer i = 0, is = input.size(); i < is; ++i)
41 output[i] = (TypeA)input[i];
42 }
43};
44
45/*---------------------------------------------------------------------------*/
46/*---------------------------------------------------------------------------*/
47
48/*!
49 * \brief Conversion of an array from one type to another type.
50 */
51template <typename InputType, typename OutputType,
52 typename Converter = DefaultConverter<InputType, OutputType>>
53class ArrayConverter
54{
55 public:
56
57 typedef UniqueArray<OutputType> OutputArrayType;
58 typedef typename OutputArrayType::iterator iterator;
59 typedef typename OutputArrayType::const_iterator const_iterator;
60 typedef typename OutputArrayType::pointer pointer;
61 typedef typename OutputArrayType::const_pointer const_pointer;
62
63 public:
64
65 ArrayConverter() {}
66
67 ArrayConverter(Converter& conv)
68 : m_converter(conv)
69 {
70 }
71
72 ArrayConverter(Integer nb, InputType* values)
73 {
74 m_input_array = ArrayView<InputType>(nb, values);
75 _init();
76 }
77
78 ArrayConverter(ArrayView<InputType> values)
79 {
80 m_input_array = values;
81 _init();
82 }
83
84 ArrayConverter(ArrayView<InputType> values, Converter& conv)
85 : m_converter(conv)
86 {
87 m_input_array = values;
88 _init();
89 }
90
91 ~ArrayConverter() noexcept(false)
92 {
93 m_converter.convertFromBToA(m_output_array, m_input_array);
94 }
95
96 void operator=(ArrayView<InputType> values)
97 {
98 m_input_array = values;
99 _init();
100 }
101
102 void notifyOutputChanged()
103 {
104 m_converter.convertFromBToA(m_output_array, m_input_array);
105 }
106
107 void notifyInputChanged()
108 {
109 m_converter.convertFromAToB(m_input_array, m_output_array);
110 }
111
112 public:
113
114 /*!
115 * \deprecated Use data() instead.
116 */
117 ARCANE_DEPRECATED_280 iterator begin() { return m_output_array.begin(); }
118 /*!
119 * \deprecated Use data() instead.
120 */
121 ARCANE_DEPRECATED_280 const_iterator begin() const { return m_output_array.begin(); }
122 OutputArrayType& array() { return m_output_array; }
123 OutputArrayType& array() const { return m_output_array; }
124 pointer data() { return m_output_array.data(); }
125 const_pointer data() const { return m_output_array.data(); }
126
127 private:
128
129 void _init()
130 {
131 m_output_array.resize(m_input_array.size());
132 m_converter.convertFromAToB(m_input_array, m_output_array);
133 }
134
135 ArrayView<InputType> m_input_array;
136 OutputArrayType m_output_array;
137 Converter m_converter;
138};
139
140/*---------------------------------------------------------------------------*/
141/*---------------------------------------------------------------------------*/
142
143/*!
144 * \brief Conversion of an array from one type to another type.
145 *
146 * Specialization for the case where the input and output types are the same.
147 */
148template <typename InputType>
149class ArrayConverter<InputType, InputType, DefaultConverter<InputType, InputType>>
150{
151 public:
152
153 typedef ArrayView<InputType> OutputArrayType;
154 typedef typename OutputArrayType::iterator iterator;
155 typedef typename OutputArrayType::const_iterator const_iterator;
156 typedef typename OutputArrayType::pointer pointer;
157 typedef typename OutputArrayType::const_pointer const_pointer;
158
159 public:
160
161 ArrayConverter()
162 {
163 }
164
165 ArrayConverter(Integer nb, InputType* values)
166 {
167 m_input_array = ArrayView<InputType>(nb, values);
168 }
169
170 ArrayConverter(ArrayView<InputType> values)
171 {
172 m_input_array = values;
173 }
174
175 ~ArrayConverter() {}
176
177 void operator=(ArrayView<InputType> values)
178 {
179 m_input_array = values;
180 }
181
182 public:
183
184 /*!
185 * \deprecated Use data() instead.
186 */
187 ARCANE_DEPRECATED_280 iterator begin() { return m_input_array.begin(); }
188 /*!
189 * \deprecated Use data() instead.
190 */
191 ARCANE_DEPRECATED_280 const_iterator begin() const { return m_input_array.begin(); }
192 OutputArrayType& array() { return m_input_array; }
193 OutputArrayType& array() const { return m_input_array; }
194 void notifyOutputChanged() {}
195 void notifyInputChanged() {}
196 pointer data() { return m_input_array.data(); }
197 const_pointer data() const { return m_input_array.data(); }
198
199 private:
200
201 ArrayView<InputType> m_input_array;
202};
203
204/*---------------------------------------------------------------------------*/
205/*---------------------------------------------------------------------------*/
206
207/*!
208 * \brief Conversion of an array from one type to another type.
209 */
210template <typename InputType, typename OutputType,
211 typename Converter = DefaultConverter<InputType, OutputType>>
212class ConstArrayConverter
213{
214 public:
215
216 typedef ConstArrayView<OutputType> OutputArrayType;
217 typedef typename OutputArrayType::const_iterator const_iterator;
218 typedef typename OutputArrayType::const_pointer const_pointer;
219
220 public:
221
222 ConstArrayConverter()
223 {
224 }
225
226 ConstArrayConverter(Converter& conv)
227 : m_converter(conv)
228 {
229 }
230
231 ConstArrayConverter(Integer nb, const InputType* values)
232 {
233 m_input_array = ConstArrayView<InputType>(nb, values);
234 _init();
235 }
236
237 ConstArrayConverter(ConstArrayView<InputType> values)
238 {
239 m_input_array = values;
240 _init();
241 }
242
243 ConstArrayConverter(ConstArrayView<InputType> values, Converter& conv)
244 : m_converter(conv)
245 {
246 m_input_array = values;
247 _init();
248 }
249
250 ~ConstArrayConverter() {}
251
252 public:
253
254 /*!
255 * \deprecated Use data() instead.
256 */
257 ARCANE_DEPRECATED_280 const_iterator begin() const { return m_output_array.begin(); }
258 OutputArrayType& array() const { return m_output_array; }
259 const_pointer data() const { return m_output_array.data(); }
260
261 private:
262
263 void _init()
264 {
265 m_output_array.resize(m_input_array.size());
266 m_converter.convertFromAToB(m_input_array, m_output_array);
267 }
268
269 ConstArrayView<InputType> m_input_array;
270 UniqueArray<OutputType> m_output_array;
271 Converter m_converter;
272};
273
274/*---------------------------------------------------------------------------*/
275/*---------------------------------------------------------------------------*/
276
277/*!
278 * \brief Conversion of an array from one type to another type.
279 *
280 * Specialization for the case where the input and output types are the same.
281 */
282template <typename InputType>
283class ConstArrayConverter<InputType, InputType, DefaultConverter<InputType, InputType>>
284{
285 public:
286
287 typedef ConstArrayView<InputType> OutputArrayType;
288 typedef typename OutputArrayType::const_iterator const_iterator;
289 typedef typename OutputArrayType::const_pointer const_pointer;
290
291 public:
292
293 ConstArrayConverter()
294 {
295 }
296
297 ConstArrayConverter(Integer nb, const InputType* values)
298 {
299 m_input_array = ConstArrayView<InputType>(nb, values);
300 }
301
302 ConstArrayConverter(ConstArrayView<InputType> values)
303 {
304 m_input_array = values;
305 }
306
307 ~ConstArrayConverter()
308 {
309 }
310
311 public:
312
313 /*!
314 * \deprecated Use data() instead.
315 */
316 ARCANE_DEPRECATED_280 const_iterator begin() const { return m_input_array.begin(); }
317 OutputArrayType& array() const { return m_input_array; }
318 const_pointer data() const { return m_input_array.data(); }
319
320 private:
321
322 ConstArrayView<InputType> m_input_array;
323};
324
325/*---------------------------------------------------------------------------*/
326/*---------------------------------------------------------------------------*/
327
328} // namespace Arcane
329
330/*---------------------------------------------------------------------------*/
331/*---------------------------------------------------------------------------*/
332
333#endif
const value_type * const_pointer
Constant pointer type of an array element.
ArrayIterator< pointer > iterator
Type of the iterator over an array element.
value_type * pointer
Pointer type of an array element.
ArrayIterator< const_pointer > const_iterator
Type of the constant iterator over an array element.
ARCANE_DEPRECATED_280 iterator begin()
ARCANE_DEPRECATED_280 const_iterator begin() const
Modifiable view of an array of type T.
constexpr const_pointer data() const noexcept
Pointer to the start of the view.
const T * data() const
Access to the root of the array without any protection.
ARCANE_DEPRECATED_280 const_iterator begin() const
Constant view of an array of type T.
constexpr const_pointer data() const noexcept
Pointer to the allocated memory.
constexpr Integer size() const noexcept
Number of elements in the array.
1D data vector with value semantics (STL style).
-- tab-width: 2; indent-tabs-mode: nil; coding: utf-8-with-signature --
Int32 Integer
Type representing an integer.