blob: 765cae4ad4ddef419ca7bff418c69da307ff3d52 [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
2 * Copyright (c) 2016, 2017 ARM Limited.
3 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
24#ifndef __ARM_COMPUTE_TYPES_H__
25#define __ARM_COMPUTE_TYPES_H__
26
27#include "arm_compute/core/Coordinates.h"
28#include "arm_compute/core/TensorShape.h"
29
30#include <cstddef>
31#include <cstdint>
32#include <string>
33#include <utility>
34
35namespace arm_compute
36{
37/** Image colour formats */
38enum class Format
39{
40 UNKNOWN, /** Unknown image format */
41 U8, /** 1 channel, 1 U8 per channel */
42 S16, /** 1 channel, 1 S16 per channel */
43 U16, /** 1 channel, 1 U16 per channel */
44 S32, /** 1 channel, 1 S32 per channel */
45 U32, /** 1 channel, 1 U32 per channel */
46 F16, /** 1 channel, 1 F16 per channel */
47 F32, /** 1 channel, 1 F32 per channel */
48 UV88, /** 2 channel, 1 U8 per channel */
49 RGB888, /** 3 channels, 1 U8 per channel */
50 RGBA8888, /** 4 channels, 1 U8 per channel */
51 YUV444, /** A 3 plane of 8 bit 4:4:4 sampled Y, U, V planes */
52 YUYV422, /** A single plane of 32-bit macro pixel of Y0, U0, Y1, V0 bytes */
53 NV12, /** A 2 plane YUV format of Luma (Y) and interleaved UV data at 4:2:0 sampling */
54 NV21, /** A 2 plane YUV format of Luma (Y) and interleaved VU data at 4:2:0 sampling */
55 IYUV, /** A 3 plane of 8-bit 4:2:0 sampled Y, U, V planes */
56 UYVY422 /** A single plane of 32-bit macro pixel of U0, Y0, V0, Y1 byte */
57};
58
59/** Available data types */
60enum class DataType
61{
62 UNKNOWN,
63 U8,
64 S8,
65 QS8,
66 U16,
67 S16,
68 QS16,
69 U32,
70 S32,
71 U64,
72 S64,
73 F16,
74 F32,
75 F64,
76 SIZET
77};
78
79/** Constant value of the border pixels when using BorderMode::CONSTANT */
80constexpr uint8_t CONSTANT_BORDER_VALUE = 199;
81
82/* Constant value used to indicate a half-scale pyramid */
83constexpr float SCALE_PYRAMID_HALF = 0.5f;
84
85/* Constant value used to indicate a ORB scaled pyramid */
86constexpr float SCALE_PYRAMID_ORB = 8.408964152537146130583778358414e-01;
87
88struct ValidRegion
89{
90 ValidRegion()
91 : anchor{}, shape{}
92 {
93 }
94
95 ValidRegion(const ValidRegion &) = default;
96 ValidRegion(ValidRegion &&) = default;
97 ValidRegion &operator=(const ValidRegion &) = default;
98 ValidRegion &operator=(ValidRegion &&) = default;
99 ~ValidRegion() = default;
100
101 ValidRegion(Coordinates anchor, TensorShape shape)
102 : anchor{ anchor }, shape{ shape }
103 {
104 }
105
106 /** Return the start of the valid region for the given dimension @p d */
107 int start(unsigned int d) const
108 {
109 return anchor[d];
110 }
111
112 /** Return the end of the valid region for the given dimension @p d */
113 int end(unsigned int d) const
114 {
115 return anchor[d] + shape[d];
116 }
117
118 Coordinates anchor;
119 TensorShape shape;
120};
121
122/** Methods available to handle borders */
123enum class BorderMode
124{
125 UNDEFINED, /**< Borders are left undefined */
126 CONSTANT, /**< Pixels outside the image are assumed to have a constant value */
127 REPLICATE /**< Pixels outside the image are assumed to have the same value as the closest image pixel */
128};
129
130/** Container for 2D border size */
131struct BorderSize
132{
133 /** Empty border, i.e. no border */
134 constexpr BorderSize()
135 : top{ 0 }, right{ 0 }, bottom{ 0 }, left{ 0 }
136 {
137 }
138
139 /** Border with equal size around the 2D plane */
140 constexpr BorderSize(unsigned int size)
141 : top{ size }, right{ size }, bottom{ size }, left{ size }
142 {
143 }
144
145 /** Border with same size for top/bottom and left/right */
146 constexpr BorderSize(unsigned int top_bottom, unsigned int left_right)
147 : top{ top_bottom }, right{ left_right }, bottom{ top_bottom }, left{ left_right }
148 {
149 }
150
151 /** Border with different sizes */
152 constexpr BorderSize(unsigned int top, unsigned int right, unsigned int bottom, unsigned int left)
153 : top{ top }, right{ right }, bottom{ bottom }, left{ left }
154 {
155 }
156
157 /** Check if the entire border is zero */
158 constexpr bool empty() const
159 {
160 return top == 0 && right == 0 && bottom == 0 && left == 0;
161 }
162
163 /** Check if the border is the same size on all sides */
164 constexpr bool uniform() const
165 {
166 return top == right && top == bottom && top == left;
167 }
168
169 BorderSize &operator*=(float scale)
170 {
171 top *= scale;
172 right *= scale;
173 bottom *= scale;
174 left *= scale;
175
176 return *this;
177 }
178
179 BorderSize operator*(float scale)
180 {
181 BorderSize size = *this;
182 size *= scale;
183
184 return size;
185 }
186
187 void limit(const BorderSize &limit)
188 {
189 top = std::min(top, limit.top);
190 right = std::min(right, limit.right);
191 bottom = std::min(bottom, limit.bottom);
192 left = std::min(left, limit.left);
193 }
194
195 unsigned int top;
196 unsigned int right;
197 unsigned int bottom;
198 unsigned int left;
199};
200
201using PaddingSize = BorderSize;
202
203/** Policy to handle overflow */
204enum class ConvertPolicy
205{
206 WRAP, /**< Wrap around */
207 SATURATE /**< Saturate */
208};
209
210/** Interpolation method */
211enum class InterpolationPolicy
212{
213 NEAREST_NEIGHBOR, /**< Output values are defined to match the source pixel whose center is nearest to the sample position */
214 BILINEAR, /**< Output values are defined by bilinear interpolation between the pixels */
215 AREA, /**< Output values are determined by averaging the source pixels whose areas fall under the area of the destination pixel, projected onto the source image */
216};
217
218/** Bilinear Interpolation method used by LKTracker */
219enum class BilinearInterpolation
220{
221 BILINEAR_OLD_NEW,
222 BILINEAR_SCHARR
223};
224
225/** Threshold mode */
226enum class ThresholdType
227{
228 BINARY, /**< Threshold with one value */
229 RANGE /**< Threshold with two values*/
230};
231
232/** Rounding method */
233enum class RoundingPolicy
234{
235 TO_ZERO, /**< Truncates the least significand values that are lost in operations. */
236 TO_NEAREST_UP, /**< Rounds to nearest value; half rounds up */
237 TO_NEAREST_EVEN /**< Rounds to nearest value; half rounds to nearest even */
238};
239
240/** Termination criteria */
241enum class Termination
242{
243 TERM_CRITERIA_EPSILON,
244 TERM_CRITERIA_ITERATIONS,
245 TERM_CRITERIA_BOTH
246};
247
248/** Magnitude calculation type. */
249enum class MagnitudeType
250{
251 L1NORM, /**< L1 normalization type */
252 L2NORM /**< L2 normalization type */
253};
254
255/** Phase calculation type.
256 *
257 * @note When PhaseType == SIGNED, each angle is mapped to the range 0 to 255 inclusive otherwise angles between 0 and 180
258 */
259enum class PhaseType
260{
261 SIGNED, /**< Angle range: [0, 360] */
262 UNSIGNED /**< Angle range: [0, 180] */
263};
264
265/** Keypoint type */
266struct KeyPoint
267{
268 int32_t x{ 0 }; /**< X coordinates */
269 int32_t y{ 0 }; /**< Y coordinates */
270 float strength{ 0.f }; /**< Strength of the point */
271 float scale{ 0.f }; /**< Scale initialized to 0 by the corner detector */
272 float orientation{ 0.f }; /**< Orientation initialized to 0 by the corner detector */
273 int32_t tracking_status{ 0 }; /**< Status initialized to 1 by the corner detector, set to 0 when the point is lost */
274 float error{ 0.f }; /**< Tracking error initialized to 0 by the corner detector */
275};
276
277using InternalKeypoint = std::tuple<float, float, float>; /* x,y,strength */
278
279/** Rectangle type */
280struct Rectangle
281{
282 uint16_t x; /**< Top-left x coordinate */
283 uint16_t y; /**< Top-left y coordinate */
284 uint16_t width; /**< Width of the rectangle */
285 uint16_t height; /**< Height of the rectangle */
286};
287
288/** Coordinate type */
289struct Coordinates2D
290{
291 int32_t x; /**< X coordinates */
292 int32_t y; /**< Y coordinates */
293};
294
295/** Coordinate type */
296struct Coordinates3D
297{
298 uint32_t x; /**< X coordinates */
299 uint32_t y; /**< Y coordinates */
300 uint32_t z; /**< Z coordinates */
301};
302
Georgios Pinitas7b7858d2017-06-21 16:44:24 +0100303/** Region of interest */
304struct ROI
305{
306 Rectangle rect; /**< Rectangle specifying the region of interest */
307 uint16_t batch_idx; /**< The batch index of the region of interest */
308};
309
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100310/** Available channels */
311enum class Channel
312{
313 UNKNOWN, /** Unknown channel format */
314 C0, /**< First channel (used by formats with unknown channel types). */
315 C1, /**< Second channel (used by formats with unknown channel types). */
316 C2, /**< Third channel (used by formats with unknown channel types). */
317 C3, /**< Fourth channel (used by formats with unknown channel types). */
318 R, /**< Red channel. */
319 G, /**< Green channel. */
320 B, /**< Blue channel. */
321 A, /**< Alpha channel. */
322 Y, /**< Luma channel. */
323 U, /**< Cb/U channel. */
324 V /**< Cr/V/Value channel. */
325};
326
327/** Available matrix patterns */
328enum class MatrixPattern
329{
330 BOX, /**< Box pattern matrix. */
331 CROSS, /**< Cross pattern matrix. */
332 DISK, /**< Disk pattern matrix. */
333 OTHER /**< Any other matrix pattern. */
334};
335
336/** Available non linear functions. */
337enum class NonLinearFilterFunction : unsigned
338{
339 MEDIAN = 0, /**< Non linear median filter. */
340 MIN = 1, /**< Non linear erode. */
341 MAX = 2, /**< Non linear dilate. */
342};
343
344/** The normalization type used for the normalization layer */
345enum class NormType
346{
347 IN_MAP_1D, /**< Normalization applied within the same map in 1D region */
348 IN_MAP_2D, /**< Normalization applied within the same map in 2D region */
349 CROSS_MAP /**< Normalization applied cross maps */
350};
351
352/** Normalization type for Histogram of Oriented Gradients (HOG) */
353enum class HOGNormType
354{
355 L2_NORM = 1, /**< L2-norm */
356 L2HYS_NORM = 2, /**< L2-norm followed by clipping */
357 L1_NORM = 3 /**< L1 norm */
358};
359
360/** Detection window used for the object detection. The detection window keeps the following information:
361 *
362 * -# Geometry of the rectangular window (x/y of top-left corner and width/height)
363 * -# Index of the class used for evaluating which class the detection window belongs to
364 * -# Confidence value (score) obtained with the classifier
365 */
366struct DetectionWindow
367{
368 uint16_t x{ 0 }; /**< Top-left x coordinate */
369 uint16_t y{ 0 }; /**< Top-left y coordinate */
370 uint16_t width{ 0 }; /**< Width of the detection window */
371 uint16_t height{ 0 }; /**< Height of the detection window */
372 uint16_t idx_class{ 0 }; /**< Index of the class */
373 float score{ 0.f }; /**< Confidence value for the detection window */
374};
375
376/** Dimension rounding type when down-scaling on CNNs
377 * @note Used in pooling and convolution layer
378 */
379enum class DimensionRoundingType
380{
381 FLOOR, /**< Floor rounding */
382 CEIL /**< Ceil rounding */
383};
384
385/** Available pooling types */
386enum class PoolingType
387{
388 MAX, /**< Max Pooling */
389 AVG /**< Average Pooling */
390};
391
392/** Padding and stride information class */
393class PadStrideInfo
394{
395public:
396 /** Constructor
397 *
398 * @param[in] stride_x (Optional) Stride, in elements, across x. Defaults to 1.
399 * @param[in] stride_y (Optional) Stride, in elements, across y. Defaults to 1.
400 * @param[in] pad_x (Optional) Padding, in elements, across x. Defaults to 0.
401 * @param[in] pad_y (Optional) Padding, in elements, across y. Defaults to 0.
402 * @param[in] round (Optional) Dimensions rounding. Defaults to @ref FLOOR.
403 */
404 PadStrideInfo(unsigned int stride_x = 1, unsigned int stride_y = 1,
405 unsigned int pad_x = 0, unsigned int pad_y = 0,
406 DimensionRoundingType round = DimensionRoundingType::FLOOR)
407 : _stride(std::make_pair(stride_x, stride_y)),
408 _pad(std::make_pair(pad_x, pad_y)),
409 _round_type(round)
410 {
411 }
412 std::pair<unsigned int, unsigned int> stride() const
413 {
414 return _stride;
415 }
416 std::pair<unsigned int, unsigned int> pad() const
417 {
418 return _pad;
419 }
420 DimensionRoundingType round() const
421 {
422 return _round_type;
423 }
424
425private:
426 std::pair<unsigned int, unsigned int> _stride;
427 std::pair<unsigned int, unsigned int> _pad;
428 DimensionRoundingType _round_type;
429};
430
431/** Pooling Layer Information class */
432class PoolingLayerInfo
433{
434public:
435 /** Default Constructor
436 *
437 * @param[in] pool_type Pooling type @ref PoolingType. Defaults to @ref PoolingType::MAX
438 * @param[in] pool_size (Optional) Pooling size, in elements, across x and y. Defaults to 2.
439 * @param[in] pad_stride_info (Optional) Padding and stride information @ref PadStrideInfo
440 */
441 PoolingLayerInfo(PoolingType pool_type = PoolingType::MAX, unsigned int pool_size = 2, PadStrideInfo pad_stride_info = PadStrideInfo())
442 : _pool_type(pool_type), _pool_size(pool_size), _pad_stride_info(pad_stride_info)
443 {
444 }
445 PoolingType pool_type() const
446 {
447 return _pool_type;
448 }
449 unsigned int pool_size() const
450 {
451 return _pool_size;
452 }
453 PadStrideInfo pad_stride_info() const
454 {
455 return _pad_stride_info;
456 }
457
458private:
459 PoolingType _pool_type;
460 unsigned int _pool_size;
461 PadStrideInfo _pad_stride_info;
462};
463
Georgios Pinitas7b7858d2017-06-21 16:44:24 +0100464/** ROI Pooling Layer Information class */
465class ROIPoolingLayerInfo
466{
467public:
468 /** Default Constructor
469 *
470 * @param[in] pooled_width Pooled width of the layer.
471 * @param[in] pooled_height Pooled height of the layer.
472 * @param[in] spatial_scale Spatial scale to be applied to the ROI coordinates and dimensions.
473 */
474 ROIPoolingLayerInfo(unsigned int pooled_width, unsigned int pooled_height, float spatial_scale)
475 : _pooled_width(pooled_width), _pooled_height(pooled_height), _spatial_scale(spatial_scale)
476 {
477 }
478 unsigned int pooled_width() const
479 {
480 return _pooled_width;
481 }
482 unsigned int pooled_height() const
483 {
484 return _pooled_height;
485 }
486 float spatial_scale() const
487 {
488 return _spatial_scale;
489 }
490
491private:
492 unsigned int _pooled_width;
493 unsigned int _pooled_height;
494 float _spatial_scale;
495};
496
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100497/** Activation Layer Information class */
498class ActivationLayerInfo
499{
500public:
501 /** Available activation functions */
502 enum class ActivationFunction
503 {
504 LOGISTIC, /**< Logistic */
505 TANH, /**< Hyperbolic tangent */
506 RELU, /**< Rectifier */
507 BOUNDED_RELU, /**< Bounded Rectifier */
Georgios Pinitas579c0492017-07-12 16:12:12 +0100508 LEAKY_RELU, /**< Leaky Rectifier */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100509 SOFT_RELU, /**< Soft Rectifier */
510 ABS, /**< Absolute */
511 SQUARE, /**< Square */
512 SQRT, /**< Square root */
513 LINEAR /**< Linear */
514 };
515
516 /** Default Constructor
517 *
518 * @param[in] f The activation function to use.
519 * @param[in] a (Optional) The alpha parameter used by some activation functions
520 * (@ref ActivationFunction::BOUNDED_RELU, @ref ActivationFunction::LINEAR, @ref ActivationFunction::TANH).
521 * @param[in] b (Optional) The beta parameter used by some activation functions (@ref ActivationFunction::LINEAR, @ref ActivationFunction::TANH).
522 */
523 ActivationLayerInfo(ActivationFunction f, float a = 0.0f, float b = 0.0f)
524 : _act(f), _a(a), _b(b)
525 {
526 }
527 ActivationFunction activation() const
528 {
529 return _act;
530 }
531 float a() const
532 {
533 return _a;
534 }
535 float b() const
536 {
537 return _b;
538 }
539
540private:
541 ActivationFunction _act;
542 float _a;
543 float _b;
544};
545
546/** Normalization Layer Information class */
547class NormalizationLayerInfo
548{
549public:
550 /** Default Constructor
551 *
552 * @param[in] type The normalization type. Can be @ref NormType::IN_MAP_1D, @ref NormType::IN_MAP_2D or @ref NORM_TYPE::CROSS_MAP
553 * @param[in] norm_size The normalization size is the number of elements to normalize across. Defaults to 5.
554 * @param[in] alpha Alpha parameter used by normalization equation. Defaults to 0.0001.
555 * @param[in] beta Beta parameter used by normalization equation. Defaults to 0.5.
556 * @param[in] kappa Kappa parameter used by [Krichevksy 2012] Across Channel Local Brightness Normalization equation.
557 */
558 NormalizationLayerInfo(NormType type, uint32_t norm_size = 5, float alpha = 0.0001f, float beta = 0.5f, float kappa = 1.f)
559 : _type(type), _norm_size(norm_size), _alpha(alpha), _beta(beta), _kappa(kappa)
560 {
561 }
562 NormType type() const
563 {
564 return _type;
565 }
566 uint32_t norm_size() const
567 {
568 return _norm_size;
569 }
570 float alpha() const
571 {
572 return _alpha;
573 }
574 float beta() const
575 {
576 return _beta;
577 }
578 float kappa() const
579 {
580 return _kappa;
581 }
582 /** Return the scaling factor of the normalization function. If kappa is not
583 * 1 then [Krichevksy 2012] normalization scaling is specified. Scaling
584 * factor takes into account the total number of elements used for the
585 * normalization, so in case of 2 dimensions this is _norm_size^2.
586 *
587 * @return The normalization scaling factor.
588 */
589 float scale_coeff() const
590 {
591 const uint32_t size = (_type == NormType::IN_MAP_2D) ? _norm_size * _norm_size : _norm_size;
592 return (_kappa == 1.f) ? (_alpha / size) : _alpha;
593 }
594
595private:
596 NormType _type;
597 uint32_t _norm_size;
598 float _alpha;
599 float _beta;
600 float _kappa;
601};
602
603/** Convolution Layer Weights Information class */
604class WeightsInfo
605{
606public:
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100607 /** Default constructor */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100608 WeightsInfo()
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100609 : _are_reshaped(false), _kernel_width(0), _kernel_height(0)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100610 {
611 }
612 /** Constructor
613 *
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100614 * @param[in] are_reshaped True if the weights have been reshaped
615 * @param[in] kernel_width Kernel width.
616 * @param[in] kernel_height Kernel height.
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100617 */
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100618 WeightsInfo(bool are_reshaped, unsigned int kernel_width, unsigned int kernel_height)
619 : _are_reshaped(are_reshaped), _kernel_width(kernel_width), _kernel_height(kernel_height)
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100620 {
621 }
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100622 /** Flag which specifies if the weights tensor has been reshaped.
623 *
624 * @return True if the weights tensors has been reshaped
625 */
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100626 bool are_reshaped() const
627 {
628 return _are_reshaped;
629 };
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100630 /** Return the width and height of the kernel
631 *
632 * @return The width and height of the kernel
633 */
634 std::pair<unsigned int, unsigned int> kernel_size() const
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100635 {
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100636 return std::make_pair(_kernel_width, _kernel_height);
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100637 }
638
639private:
640 const bool _are_reshaped;
Gian Marco Iodice4e288692017-06-27 11:41:59 +0100641 const unsigned int _kernel_width;
642 const unsigned int _kernel_height;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100643};
644
645/** IO formatting information class*/
646struct IOFormatInfo
647{
648 /** Precision type used when printing floating point numbers */
649 enum class PrecisionType
650 {
651 Default, /**< Default precision to the one that the current stream has */
652 Custom, /**< Custom precision specified by the user using the precision parameter */
653 Full /**< The maximum precision of the floating point representation */
654 };
655
656 /** Specifies the area to be printed, used by Tensor objects */
657 enum class PrintRegion
658 {
659 ValidRegion, /**< Prints the valid region of the Tensor object */
660 NoPadding, /**< Prints the Tensor object without the padding */
661 Full /**< Print the tensor object including padding */
662 };
663
664 IOFormatInfo(PrintRegion print_region = PrintRegion::ValidRegion,
665 PrecisionType precision_type = PrecisionType::Default,
666 unsigned int precision = 10,
667 bool align_columns = true,
668 std::string element_delim = " ",
669 std::string row_delim = "\n")
670 : print_region(print_region),
671 precision_type(precision_type),
672 precision(precision),
673 element_delim(element_delim),
674 row_delim(row_delim),
675 align_columns(align_columns)
676 {
677 }
678
679 PrintRegion print_region;
680 PrecisionType precision_type;
681 unsigned int precision;
682 std::string element_delim;
683 std::string row_delim;
684 bool align_columns;
685};
686}
687#endif /* __ARM_COMPUTE_TYPES_H__ */