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