xref: /aosp_15_r20/external/deqp/framework/common/tcuFormatUtil.hpp (revision 35238bce31c2a825756842865a792f8cf7f89930)
1*35238bceSAndroid Build Coastguard Worker #ifndef _TCUFORMATUTIL_HPP
2*35238bceSAndroid Build Coastguard Worker #define _TCUFORMATUTIL_HPP
3*35238bceSAndroid Build Coastguard Worker /*-------------------------------------------------------------------------
4*35238bceSAndroid Build Coastguard Worker  * drawElements Quality Program Tester Core
5*35238bceSAndroid Build Coastguard Worker  * ----------------------------------------
6*35238bceSAndroid Build Coastguard Worker  *
7*35238bceSAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
8*35238bceSAndroid Build Coastguard Worker  *
9*35238bceSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
10*35238bceSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
11*35238bceSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
12*35238bceSAndroid Build Coastguard Worker  *
13*35238bceSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
14*35238bceSAndroid Build Coastguard Worker  *
15*35238bceSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
16*35238bceSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
17*35238bceSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18*35238bceSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
19*35238bceSAndroid Build Coastguard Worker  * limitations under the License.
20*35238bceSAndroid Build Coastguard Worker  *
21*35238bceSAndroid Build Coastguard Worker  *//*!
22*35238bceSAndroid Build Coastguard Worker  * \file
23*35238bceSAndroid Build Coastguard Worker  * \brief String format utilities.
24*35238bceSAndroid Build Coastguard Worker  *//*--------------------------------------------------------------------*/
25*35238bceSAndroid Build Coastguard Worker 
26*35238bceSAndroid Build Coastguard Worker #include "tcuDefs.hpp"
27*35238bceSAndroid Build Coastguard Worker #include "deString.h"
28*35238bceSAndroid Build Coastguard Worker 
29*35238bceSAndroid Build Coastguard Worker #include <ostream>
30*35238bceSAndroid Build Coastguard Worker #include <string>
31*35238bceSAndroid Build Coastguard Worker #include <sstream>
32*35238bceSAndroid Build Coastguard Worker #include <iomanip>
33*35238bceSAndroid Build Coastguard Worker 
34*35238bceSAndroid Build Coastguard Worker namespace tcu
35*35238bceSAndroid Build Coastguard Worker {
36*35238bceSAndroid Build Coastguard Worker namespace Format
37*35238bceSAndroid Build Coastguard Worker {
38*35238bceSAndroid Build Coastguard Worker 
39*35238bceSAndroid Build Coastguard Worker // Hexadecimal value formatter.
40*35238bceSAndroid Build Coastguard Worker template <size_t NumDigits>
41*35238bceSAndroid Build Coastguard Worker class Hex
42*35238bceSAndroid Build Coastguard Worker {
43*35238bceSAndroid Build Coastguard Worker public:
Hex(uint64_t value_)44*35238bceSAndroid Build Coastguard Worker     Hex(uint64_t value_) : value(value_)
45*35238bceSAndroid Build Coastguard Worker     {
46*35238bceSAndroid Build Coastguard Worker     }
47*35238bceSAndroid Build Coastguard Worker 
toStream(std::ostream & stream) const48*35238bceSAndroid Build Coastguard Worker     std::ostream &toStream(std::ostream &stream) const
49*35238bceSAndroid Build Coastguard Worker     {
50*35238bceSAndroid Build Coastguard Worker         DE_STATIC_ASSERT(0 < NumDigits && NumDigits <= 16);
51*35238bceSAndroid Build Coastguard Worker 
52*35238bceSAndroid Build Coastguard Worker         return stream << "0x" << std::right << std::setfill('0') << std::setw(NumDigits) << std::hex << value;
53*35238bceSAndroid Build Coastguard Worker     }
54*35238bceSAndroid Build Coastguard Worker 
toString(void) const55*35238bceSAndroid Build Coastguard Worker     std::string toString(void) const
56*35238bceSAndroid Build Coastguard Worker     {
57*35238bceSAndroid Build Coastguard Worker         std::stringstream stream;
58*35238bceSAndroid Build Coastguard Worker 
59*35238bceSAndroid Build Coastguard Worker         toStream(stream);
60*35238bceSAndroid Build Coastguard Worker         return stream.str();
61*35238bceSAndroid Build Coastguard Worker     }
62*35238bceSAndroid Build Coastguard Worker 
63*35238bceSAndroid Build Coastguard Worker private:
64*35238bceSAndroid Build Coastguard Worker     uint64_t value;
65*35238bceSAndroid Build Coastguard Worker };
66*35238bceSAndroid Build Coastguard Worker 
67*35238bceSAndroid Build Coastguard Worker template <size_t NumDigits>
operator <<(std::ostream & stream,tcu::Format::Hex<NumDigits> hex)68*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &stream, tcu::Format::Hex<NumDigits> hex)
69*35238bceSAndroid Build Coastguard Worker {
70*35238bceSAndroid Build Coastguard Worker     return hex.toStream(stream);
71*35238bceSAndroid Build Coastguard Worker }
72*35238bceSAndroid Build Coastguard Worker 
73*35238bceSAndroid Build Coastguard Worker // Bitfield formatter.
74*35238bceSAndroid Build Coastguard Worker 
75*35238bceSAndroid Build Coastguard Worker class BitDesc
76*35238bceSAndroid Build Coastguard Worker {
77*35238bceSAndroid Build Coastguard Worker public:
78*35238bceSAndroid Build Coastguard Worker     uint64_t bit;
79*35238bceSAndroid Build Coastguard Worker     const char *name;
80*35238bceSAndroid Build Coastguard Worker 
BitDesc(uint64_t bit_,const char * name_)81*35238bceSAndroid Build Coastguard Worker     BitDesc(uint64_t bit_, const char *name_) : bit(bit_), name(name_)
82*35238bceSAndroid Build Coastguard Worker     {
83*35238bceSAndroid Build Coastguard Worker     }
84*35238bceSAndroid Build Coastguard Worker };
85*35238bceSAndroid Build Coastguard Worker 
86*35238bceSAndroid Build Coastguard Worker #define TCU_BIT_DESC(BIT) tcu::Format::BitDesc(BIT, #BIT)
87*35238bceSAndroid Build Coastguard Worker 
88*35238bceSAndroid Build Coastguard Worker template <size_t BitfieldSize>
89*35238bceSAndroid Build Coastguard Worker class Bitfield
90*35238bceSAndroid Build Coastguard Worker {
91*35238bceSAndroid Build Coastguard Worker public:
Bitfield(uint64_t value,const BitDesc * begin,const BitDesc * end)92*35238bceSAndroid Build Coastguard Worker     Bitfield(uint64_t value, const BitDesc *begin, const BitDesc *end) : m_value(value), m_begin(begin), m_end(end)
93*35238bceSAndroid Build Coastguard Worker     {
94*35238bceSAndroid Build Coastguard Worker     }
95*35238bceSAndroid Build Coastguard Worker 
toStream(std::ostream & stream)96*35238bceSAndroid Build Coastguard Worker     std::ostream &toStream(std::ostream &stream)
97*35238bceSAndroid Build Coastguard Worker     {
98*35238bceSAndroid Build Coastguard Worker         uint64_t bitsLeft = m_value;
99*35238bceSAndroid Build Coastguard Worker         for (const BitDesc *curDesc = m_begin; curDesc != m_end; curDesc++)
100*35238bceSAndroid Build Coastguard Worker         {
101*35238bceSAndroid Build Coastguard Worker             if (curDesc->bit & bitsLeft)
102*35238bceSAndroid Build Coastguard Worker             {
103*35238bceSAndroid Build Coastguard Worker                 if (bitsLeft != m_value)
104*35238bceSAndroid Build Coastguard Worker                     stream << "|";
105*35238bceSAndroid Build Coastguard Worker                 stream << curDesc->name;
106*35238bceSAndroid Build Coastguard Worker                 bitsLeft ^= curDesc->bit;
107*35238bceSAndroid Build Coastguard Worker             }
108*35238bceSAndroid Build Coastguard Worker         }
109*35238bceSAndroid Build Coastguard Worker 
110*35238bceSAndroid Build Coastguard Worker         if (bitsLeft != 0)
111*35238bceSAndroid Build Coastguard Worker         {
112*35238bceSAndroid Build Coastguard Worker             if (bitsLeft != m_value)
113*35238bceSAndroid Build Coastguard Worker                 stream << "|";
114*35238bceSAndroid Build Coastguard Worker             stream << Hex<BitfieldSize / 4>(bitsLeft);
115*35238bceSAndroid Build Coastguard Worker         }
116*35238bceSAndroid Build Coastguard Worker 
117*35238bceSAndroid Build Coastguard Worker         return stream;
118*35238bceSAndroid Build Coastguard Worker     }
119*35238bceSAndroid Build Coastguard Worker 
120*35238bceSAndroid Build Coastguard Worker private:
121*35238bceSAndroid Build Coastguard Worker     uint64_t m_value;
122*35238bceSAndroid Build Coastguard Worker     const BitDesc *m_begin;
123*35238bceSAndroid Build Coastguard Worker     const BitDesc *m_end;
124*35238bceSAndroid Build Coastguard Worker };
125*35238bceSAndroid Build Coastguard Worker 
126*35238bceSAndroid Build Coastguard Worker template <size_t BitfieldSize>
operator <<(std::ostream & stream,Bitfield<BitfieldSize> decoder)127*35238bceSAndroid Build Coastguard Worker inline std::ostream &operator<<(std::ostream &stream, Bitfield<BitfieldSize> decoder)
128*35238bceSAndroid Build Coastguard Worker {
129*35238bceSAndroid Build Coastguard Worker     return decoder.toStream(stream);
130*35238bceSAndroid Build Coastguard Worker }
131*35238bceSAndroid Build Coastguard Worker 
132*35238bceSAndroid Build Coastguard Worker // Enum formatter.
133*35238bceSAndroid Build Coastguard Worker // \todo [2012-10-30 pyry] Use template for GetName.
134*35238bceSAndroid Build Coastguard Worker template <typename T, size_t NumBytes = sizeof(T)>
135*35238bceSAndroid Build Coastguard Worker class Enum
136*35238bceSAndroid Build Coastguard Worker {
137*35238bceSAndroid Build Coastguard Worker public:
138*35238bceSAndroid Build Coastguard Worker     typedef const char *(*GetNameFunc)(T value);
139*35238bceSAndroid Build Coastguard Worker 
Enum(GetNameFunc getName,T value)140*35238bceSAndroid Build Coastguard Worker     Enum(GetNameFunc getName, T value) : m_getName(getName), m_value(value)
141*35238bceSAndroid Build Coastguard Worker     {
142*35238bceSAndroid Build Coastguard Worker     }
143*35238bceSAndroid Build Coastguard Worker 
toStream(std::ostream & stream) const144*35238bceSAndroid Build Coastguard Worker     std::ostream &toStream(std::ostream &stream) const
145*35238bceSAndroid Build Coastguard Worker     {
146*35238bceSAndroid Build Coastguard Worker         const char *name = m_getName(m_value);
147*35238bceSAndroid Build Coastguard Worker         if (name)
148*35238bceSAndroid Build Coastguard Worker             return stream << name;
149*35238bceSAndroid Build Coastguard Worker         else
150*35238bceSAndroid Build Coastguard Worker             return stream << Hex<NumBytes * 2>((uint64_t)m_value);
151*35238bceSAndroid Build Coastguard Worker     }
152*35238bceSAndroid Build Coastguard Worker 
toString(void) const153*35238bceSAndroid Build Coastguard Worker     std::string toString(void) const
154*35238bceSAndroid Build Coastguard Worker     {
155*35238bceSAndroid Build Coastguard Worker         const char *name = m_getName(m_value);
156*35238bceSAndroid Build Coastguard Worker         if (name)
157*35238bceSAndroid Build Coastguard Worker             return std::string(name);
158*35238bceSAndroid Build Coastguard Worker         else
159*35238bceSAndroid Build Coastguard Worker             return Hex<NumBytes * 2>((uint64_t)m_value).toString();
160*35238bceSAndroid Build Coastguard Worker     }
161*35238bceSAndroid Build Coastguard Worker 
162*35238bceSAndroid Build Coastguard Worker private:
163*35238bceSAndroid Build Coastguard Worker     const GetNameFunc m_getName;
164*35238bceSAndroid Build Coastguard Worker     const T m_value;
165*35238bceSAndroid Build Coastguard Worker };
166*35238bceSAndroid Build Coastguard Worker 
167*35238bceSAndroid Build Coastguard Worker template <typename T, size_t NumBytes>
operator <<(std::ostream & stream,const Enum<T,NumBytes> & fmt)168*35238bceSAndroid Build Coastguard Worker inline std::ostream &operator<<(std::ostream &stream, const Enum<T, NumBytes> &fmt)
169*35238bceSAndroid Build Coastguard Worker {
170*35238bceSAndroid Build Coastguard Worker     return fmt.toStream(stream);
171*35238bceSAndroid Build Coastguard Worker }
172*35238bceSAndroid Build Coastguard Worker 
173*35238bceSAndroid Build Coastguard Worker // Array formatters.
174*35238bceSAndroid Build Coastguard Worker 
175*35238bceSAndroid Build Coastguard Worker template <typename Iterator>
176*35238bceSAndroid Build Coastguard Worker class Array
177*35238bceSAndroid Build Coastguard Worker {
178*35238bceSAndroid Build Coastguard Worker public:
179*35238bceSAndroid Build Coastguard Worker     Iterator begin;
180*35238bceSAndroid Build Coastguard Worker     Iterator end;
181*35238bceSAndroid Build Coastguard Worker 
Array(const Iterator & begin_,const Iterator & end_)182*35238bceSAndroid Build Coastguard Worker     Array(const Iterator &begin_, const Iterator &end_) : begin(begin_), end(end_)
183*35238bceSAndroid Build Coastguard Worker     {
184*35238bceSAndroid Build Coastguard Worker     }
185*35238bceSAndroid Build Coastguard Worker };
186*35238bceSAndroid Build Coastguard Worker 
187*35238bceSAndroid Build Coastguard Worker template <typename T>
188*35238bceSAndroid Build Coastguard Worker class ArrayPointer
189*35238bceSAndroid Build Coastguard Worker {
190*35238bceSAndroid Build Coastguard Worker public:
191*35238bceSAndroid Build Coastguard Worker     const T *arr;
192*35238bceSAndroid Build Coastguard Worker     int size;
193*35238bceSAndroid Build Coastguard Worker 
ArrayPointer(const T * arr_,int size_)194*35238bceSAndroid Build Coastguard Worker     ArrayPointer(const T *arr_, int size_) : arr(arr_), size(size_)
195*35238bceSAndroid Build Coastguard Worker     {
196*35238bceSAndroid Build Coastguard Worker     }
197*35238bceSAndroid Build Coastguard Worker };
198*35238bceSAndroid Build Coastguard Worker 
199*35238bceSAndroid Build Coastguard Worker template <typename Iterator>
operator <<(std::ostream & str,const Array<Iterator> & fmt)200*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const Array<Iterator> &fmt)
201*35238bceSAndroid Build Coastguard Worker {
202*35238bceSAndroid Build Coastguard Worker     str << "{ ";
203*35238bceSAndroid Build Coastguard Worker     for (Iterator cur = fmt.begin; cur != fmt.end; ++cur)
204*35238bceSAndroid Build Coastguard Worker     {
205*35238bceSAndroid Build Coastguard Worker         if (cur != fmt.begin)
206*35238bceSAndroid Build Coastguard Worker             str << ", ";
207*35238bceSAndroid Build Coastguard Worker         str << *cur;
208*35238bceSAndroid Build Coastguard Worker     }
209*35238bceSAndroid Build Coastguard Worker     str << " }";
210*35238bceSAndroid Build Coastguard Worker     return str;
211*35238bceSAndroid Build Coastguard Worker }
212*35238bceSAndroid Build Coastguard Worker 
213*35238bceSAndroid Build Coastguard Worker template <typename T>
operator <<(std::ostream & str,const ArrayPointer<T> & fmt)214*35238bceSAndroid Build Coastguard Worker std::ostream &operator<<(std::ostream &str, const ArrayPointer<T> &fmt)
215*35238bceSAndroid Build Coastguard Worker {
216*35238bceSAndroid Build Coastguard Worker     if (fmt.arr != DE_NULL)
217*35238bceSAndroid Build Coastguard Worker         return str << Array<const T *>(fmt.arr, fmt.arr + fmt.size);
218*35238bceSAndroid Build Coastguard Worker     else
219*35238bceSAndroid Build Coastguard Worker         return str << "(null)";
220*35238bceSAndroid Build Coastguard Worker }
221*35238bceSAndroid Build Coastguard Worker 
222*35238bceSAndroid Build Coastguard Worker // Hex format iterator (useful for combining with ArrayFormatter).
223*35238bceSAndroid Build Coastguard Worker // \todo [2012-10-30 pyry] Implement more generic format iterator.
224*35238bceSAndroid Build Coastguard Worker 
225*35238bceSAndroid Build Coastguard Worker template <typename T, typename Iterator = const T *>
226*35238bceSAndroid Build Coastguard Worker class HexIterator
227*35238bceSAndroid Build Coastguard Worker {
228*35238bceSAndroid Build Coastguard Worker public:
HexIterator(Iterator iter)229*35238bceSAndroid Build Coastguard Worker     HexIterator(Iterator iter) : m_iter(iter)
230*35238bceSAndroid Build Coastguard Worker     {
231*35238bceSAndroid Build Coastguard Worker     }
232*35238bceSAndroid Build Coastguard Worker 
operator ++(void)233*35238bceSAndroid Build Coastguard Worker     HexIterator<T, Iterator> &operator++(void)
234*35238bceSAndroid Build Coastguard Worker     {
235*35238bceSAndroid Build Coastguard Worker         ++m_iter;
236*35238bceSAndroid Build Coastguard Worker         return *this;
237*35238bceSAndroid Build Coastguard Worker     }
operator ++(int)238*35238bceSAndroid Build Coastguard Worker     HexIterator<T, Iterator> operator++(int)
239*35238bceSAndroid Build Coastguard Worker     {
240*35238bceSAndroid Build Coastguard Worker         return HexIterator(m_iter++);
241*35238bceSAndroid Build Coastguard Worker     }
242*35238bceSAndroid Build Coastguard Worker 
operator ==(const HexIterator<T,Iterator> & other) const243*35238bceSAndroid Build Coastguard Worker     bool operator==(const HexIterator<T, Iterator> &other) const
244*35238bceSAndroid Build Coastguard Worker     {
245*35238bceSAndroid Build Coastguard Worker         return m_iter == other.m_iter;
246*35238bceSAndroid Build Coastguard Worker     }
operator !=(const HexIterator<T,Iterator> & other) const247*35238bceSAndroid Build Coastguard Worker     bool operator!=(const HexIterator<T, Iterator> &other) const
248*35238bceSAndroid Build Coastguard Worker     {
249*35238bceSAndroid Build Coastguard Worker         return m_iter != other.m_iter;
250*35238bceSAndroid Build Coastguard Worker     }
251*35238bceSAndroid Build Coastguard Worker 
252*35238bceSAndroid Build Coastguard Worker #if !defined(__INTELLISENSE__)
253*35238bceSAndroid Build Coastguard Worker     // Intellisense in VS2013 crashes when parsing this.
operator *(void) const254*35238bceSAndroid Build Coastguard Worker     Hex<sizeof(T) * 2> operator*(void) const
255*35238bceSAndroid Build Coastguard Worker     {
256*35238bceSAndroid Build Coastguard Worker         return Hex<sizeof(T) * 2>(*m_iter);
257*35238bceSAndroid Build Coastguard Worker     }
258*35238bceSAndroid Build Coastguard Worker #endif
259*35238bceSAndroid Build Coastguard Worker 
260*35238bceSAndroid Build Coastguard Worker private:
261*35238bceSAndroid Build Coastguard Worker     Iterator m_iter;
262*35238bceSAndroid Build Coastguard Worker };
263*35238bceSAndroid Build Coastguard Worker 
264*35238bceSAndroid Build Coastguard Worker } // namespace Format
265*35238bceSAndroid Build Coastguard Worker 
266*35238bceSAndroid Build Coastguard Worker template <int Bits>
makeMask64(void)267*35238bceSAndroid Build Coastguard Worker inline uint64_t makeMask64(void)
268*35238bceSAndroid Build Coastguard Worker {
269*35238bceSAndroid Build Coastguard Worker     return (1ull << Bits) - 1;
270*35238bceSAndroid Build Coastguard Worker }
271*35238bceSAndroid Build Coastguard Worker template <>
makeMask64(void)272*35238bceSAndroid Build Coastguard Worker inline uint64_t makeMask64<64>(void)
273*35238bceSAndroid Build Coastguard Worker {
274*35238bceSAndroid Build Coastguard Worker     return ~0ull;
275*35238bceSAndroid Build Coastguard Worker }
276*35238bceSAndroid Build Coastguard Worker template <typename T>
toUint64(T value)277*35238bceSAndroid Build Coastguard Worker inline uint64_t toUint64(T value)
278*35238bceSAndroid Build Coastguard Worker {
279*35238bceSAndroid Build Coastguard Worker     return (uint64_t)value & makeMask64<sizeof(T) * 8>();
280*35238bceSAndroid Build Coastguard Worker }
281*35238bceSAndroid Build Coastguard Worker 
282*35238bceSAndroid Build Coastguard Worker /** Format value as hexadecimal number. */
283*35238bceSAndroid Build Coastguard Worker template <size_t NumDigits, typename T>
toHex(T value)284*35238bceSAndroid Build Coastguard Worker inline Format::Hex<NumDigits> toHex(T value)
285*35238bceSAndroid Build Coastguard Worker {
286*35238bceSAndroid Build Coastguard Worker     return Format::Hex<NumDigits>(toUint64(value));
287*35238bceSAndroid Build Coastguard Worker }
288*35238bceSAndroid Build Coastguard Worker 
289*35238bceSAndroid Build Coastguard Worker /** Format value as hexadecimal number. */
290*35238bceSAndroid Build Coastguard Worker template <typename T>
toHex(T value)291*35238bceSAndroid Build Coastguard Worker inline Format::Hex<sizeof(T) * 2> toHex(T value)
292*35238bceSAndroid Build Coastguard Worker {
293*35238bceSAndroid Build Coastguard Worker     return Format::Hex<sizeof(T) * 2>(toUint64(value));
294*35238bceSAndroid Build Coastguard Worker }
295*35238bceSAndroid Build Coastguard Worker 
296*35238bceSAndroid Build Coastguard Worker /** Decode and format bitfield. */
297*35238bceSAndroid Build Coastguard Worker template <typename T, size_t Size>
formatBitfield(T value,const Format::BitDesc (& desc)[Size])298*35238bceSAndroid Build Coastguard Worker inline Format::Bitfield<sizeof(T) * 8> formatBitfield(T value, const Format::BitDesc (&desc)[Size])
299*35238bceSAndroid Build Coastguard Worker {
300*35238bceSAndroid Build Coastguard Worker     return Format::Bitfield<sizeof(T) * 8>((uint64_t)value, &desc[0], &desc[Size]);
301*35238bceSAndroid Build Coastguard Worker }
302*35238bceSAndroid Build Coastguard Worker 
303*35238bceSAndroid Build Coastguard Worker /** Format array contents. */
304*35238bceSAndroid Build Coastguard Worker template <typename Iterator>
formatArray(const Iterator & begin,const Iterator & end)305*35238bceSAndroid Build Coastguard Worker inline Format::Array<Iterator> formatArray(const Iterator &begin, const Iterator &end)
306*35238bceSAndroid Build Coastguard Worker {
307*35238bceSAndroid Build Coastguard Worker     return Format::Array<Iterator>(begin, end);
308*35238bceSAndroid Build Coastguard Worker }
309*35238bceSAndroid Build Coastguard Worker 
310*35238bceSAndroid Build Coastguard Worker /** Format array contents. */
311*35238bceSAndroid Build Coastguard Worker template <typename T>
formatArray(const T * arr,int size)312*35238bceSAndroid Build Coastguard Worker inline Format::ArrayPointer<T> formatArray(const T *arr, int size)
313*35238bceSAndroid Build Coastguard Worker {
314*35238bceSAndroid Build Coastguard Worker     return Format::ArrayPointer<T>(arr, size);
315*35238bceSAndroid Build Coastguard Worker }
316*35238bceSAndroid Build Coastguard Worker 
317*35238bceSAndroid Build Coastguard Worker /** Format array contents. */
318*35238bceSAndroid Build Coastguard Worker template <typename T, int Size>
formatArray(const T (& arr)[Size])319*35238bceSAndroid Build Coastguard Worker inline Format::ArrayPointer<T> formatArray(const T (&arr)[Size])
320*35238bceSAndroid Build Coastguard Worker {
321*35238bceSAndroid Build Coastguard Worker     return Format::ArrayPointer<T>(arr, Size);
322*35238bceSAndroid Build Coastguard Worker }
323*35238bceSAndroid Build Coastguard Worker 
324*35238bceSAndroid Build Coastguard Worker } // namespace tcu
325*35238bceSAndroid Build Coastguard Worker 
326*35238bceSAndroid Build Coastguard Worker #endif // _TCUFORMATUTIL_HPP
327