xref: /aosp_15_r20/external/ComputeLibrary/tests/RawTensor.h (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2017-2019 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_TEST_RAW_TENSOR_H
25 #define ARM_COMPUTE_TEST_RAW_TENSOR_H
26 
27 #include "tests/SimpleTensor.h"
28 
29 namespace arm_compute
30 {
31 namespace test
32 {
33 /** Subclass of SimpleTensor using uint8_t as value type.
34  *
35  * Access operations (except for operator[]) will be based on the data type to
36  * copy the right number of elements.
37  */
38 class RawTensor : public SimpleTensor<uint8_t>
39 {
40 public:
41     /** Create an uninitialised tensor of the given @p shape and @p format.
42      *
43      * @param[in] shape  Shape of the new raw tensor.
44      * @param[in] format Format of the new raw tensor.
45      */
46     RawTensor(TensorShape shape, Format format);
47 
48     /** Create an uninitialised tensor of the given @p shape and @p data type.
49      *
50      * @param[in] shape        Shape of the new raw tensor.
51      * @param[in] data_type    Data type of the new raw tensor.
52      * @param[in] num_channels (Optional) Number of channels (default = 1).
53      */
54     RawTensor(TensorShape shape, DataType data_type, int num_channels = 1);
55 
56     /** Conversion constructor from SimpleTensor.
57      *
58      * The passed SimpleTensor will be destroyed after it has been converted to
59      * a RawTensor.
60      *
61      * @param[in,out] tensor SimpleTensor to be converted to a RawTensor.
62      */
63     template <typename T>
RawTensor(SimpleTensor<T> && tensor)64     RawTensor(SimpleTensor<T> &&tensor)
65     {
66         _buffer       = std::unique_ptr<uint8_t[]>(reinterpret_cast<uint8_t *>(tensor._buffer.release()));
67         _shape        = std::move(tensor._shape);
68         _format       = tensor._format;
69         _data_type    = tensor._data_type;
70         _num_channels = tensor._num_channels;
71         _data_layout  = tensor._data_layout;
72     }
73 
74     /** Conversion operator to SimpleTensor.
75      *
76      * The current RawTensor must not be used after the conversion.
77      *
78      * @return SimpleTensor of the given type.
79      */
80     template <typename T>
81     operator SimpleTensor<T>()
82     {
83         SimpleTensor<T> cast;
84         cast._buffer       = std::unique_ptr<T[]>(reinterpret_cast<T *>(_buffer.release()));
85         cast._shape        = std::move(_shape);
86         cast._format       = _format;
87         cast._data_type    = _data_type;
88         cast._num_channels = _num_channels;
89         cast._data_layout  = _data_layout;
90 
91         return cast;
92     }
93 
94     /** Create a deep copy of the given @p tensor.
95      *
96      * @param[in] tensor To be copied tensor.
97      */
98     RawTensor(const RawTensor &tensor);
99 
100     /** Copy the given @p tensor.
101      *
102      * @param[in] tensor To be copied tensor.
103      *
104      * @return a copy of the given tensor.
105      */
106     RawTensor &operator=(RawTensor tensor);
107     /** Allow instances of this class to be move constructed */
108     RawTensor(RawTensor &&) = default;
109     /** Default destructor. */
110     ~RawTensor() = default;
111 
112     /** Read only access to the specified element.
113      *
114      * @param[in] coord Coordinates of the desired element.
115      *
116      * @return A pointer to the desired element.
117      */
118     const void *operator()(const Coordinates &coord) const override;
119 
120     /** Access to the specified element.
121      *
122      * @param[in] coord Coordinates of the desired element.
123      *
124      * @return A pointer to the desired element.
125      */
126     void *operator()(const Coordinates &coord) override;
127 };
128 } // namespace test
129 } // namespace arm_compute
130 #endif /* ARM_COMPUTE_TEST_RAW_TENSOR_H */
131