OpenCoverage

StdLibExtras.h

Absolute File Name:/home/opencoverage/opencoverage/guest-scripts/qtdeclarative/src/qtdeclarative/src/3rdparty/masm/wtf/StdLibExtras.h
Source codeSwitch to Preprocessed file
LineSourceCount
1/*-
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.-
3 *-
4 * Redistribution and use in source and binary forms, with or without-
5 * modification, are permitted provided that the following conditions-
6 * are met:-
7 * 1. Redistributions of source code must retain the above copyright-
8 * notice, this list of conditions and the following disclaimer.-
9 * 2. Redistributions in binary form must reproduce the above copyright-
10 * notice, this list of conditions and the following disclaimer in the-
11 * documentation and/or other materials provided with the distribution.-
12 *-
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY-
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE-
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR-
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR-
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,-
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,-
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR-
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY-
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT-
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE-
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -
24 */-
25-
26#ifndef WTF_StdLibExtras_h-
27#define WTF_StdLibExtras_h-
28-
29#include <wtf/Assertions.h>-
30#include <wtf/CheckedArithmetic.h>-
31-
32// Use these to declare and define a static local variable (static T;) so that-
33// it is leaked so that its destructors are not called at exit. Using this-
34// macro also allows workarounds a compiler bug present in Apple's version of GCC 4.0.1.-
35#ifndef DEFINE_STATIC_LOCAL-
36#if COMPILER(GCC) && defined(__APPLE_CC__) && __GNUC__ == 4 && __GNUC_MINOR__ == 0 && __GNUC_PATCHLEVEL__ == 1-
37#define DEFINE_STATIC_LOCAL(type, name, arguments) \-
38 static type* name##Ptr = new type arguments; \-
39 type& name = *name##Ptr-
40#else-
41#define DEFINE_STATIC_LOCAL(type, name, arguments) \-
42 static type& name = *new type arguments-
43#endif-
44#endif-
45-
46// Use this macro to declare and define a debug-only global variable that may have a-
47// non-trivial constructor and destructor. When building with clang, this will suppress-
48// warnings about global constructors and exit-time destructors.-
49#ifndef NDEBUG-
50#if COMPILER(CLANG)-
51#define DEFINE_DEBUG_ONLY_GLOBAL(type, name, arguments) \-
52 _Pragma("clang diagnostic push") \-
53 _Pragma("clang diagnostic ignored \"-Wglobal-constructors\"") \-
54 _Pragma("clang diagnostic ignored \"-Wexit-time-destructors\"") \-
55 static type name arguments; \-
56 _Pragma("clang diagnostic pop")-
57#else-
58#define DEFINE_DEBUG_ONLY_GLOBAL(type, name, arguments) \-
59 static type name arguments;-
60#endif // COMPILER(CLANG)-
61#else-
62#define DEFINE_DEBUG_ONLY_GLOBAL(type, name, arguments)-
63#endif // NDEBUG-
64-
65// OBJECT_OFFSETOF: Like the C++ offsetof macro, but you can use it with classes.-
66// The magic number 0x4000 is insignificant. We use it to avoid using NULL, since-
67// NULL can cause compiler problems, especially in cases of multiple inheritance.-
68#define OBJECT_OFFSETOF(class, field) (reinterpret_cast<ptrdiff_t>(&(reinterpret_cast<class*>(0x4000)->field)) - 0x4000)-
69-
70// STRINGIZE: Can convert any value to quoted string, even expandable macros-
71#define STRINGIZE(exp) #exp-
72#define STRINGIZE_VALUE_OF(exp) STRINGIZE(exp)-
73-
74/*-
75 * The reinterpret_cast<Type1*>([pointer to Type2]) expressions - where-
76 * sizeof(Type1) > sizeof(Type2) - cause the following warning on ARM with GCC:-
77 * increases required alignment of target type.-
78 *-
79 * An implicit or an extra static_cast<void*> bypasses the warning.-
80 * For more info see the following bugzilla entries:-
81 * - https://bugs.webkit.org/show_bug.cgi?id=38045-
82 * - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43976-
83 */-
84#if (CPU(ARM) || CPU(MIPS)) && COMPILER(GCC)-
85template<typename Type>-
86bool isPointerTypeAlignmentOkay(Type* ptr)-
87{-
88 return !(reinterpret_cast<intptr_t>(ptr) % __alignof__(Type));-
89}-
90-
91template<typename TypePtr>-
92TypePtr reinterpret_cast_ptr(void* ptr)-
93{-
94 ASSERT(isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr)));-
95 return reinterpret_cast<TypePtr>(ptr);-
96}-
97-
98template<typename TypePtr>-
99TypePtr reinterpret_cast_ptr(const void* ptr)-
100{-
101 ASSERT(isPointerTypeAlignmentOkay(reinterpret_cast<TypePtr>(ptr)));-
102 return reinterpret_cast<TypePtr>(ptr);-
103}-
104#else-
105template<typename Type>-
106bool isPointerTypeAlignmentOkay(Type*)-
107{-
108 return true;
never executed: return true;
0
109}-
110#define reinterpret_cast_ptr reinterpret_cast-
111#endif-
112-
113namespace WTF {-
114-
115static const size_t KB = 1024;-
116static const size_t MB = 1024 * 1024;-
117-
118inline bool isPointerAligned(void* p)-
119{-
120 return !((intptr_t)(p) & (sizeof(char*) - 1));
never executed: return !((intptr_t)(p) & (sizeof(char*) - 1));
0
121}-
122-
123inline bool is8ByteAligned(void* p)-
124{-
125 return !((uintptr_t)(p) & (sizeof(double) - 1));
never executed: return !((uintptr_t)(p) & (sizeof(double) - 1));
0
126}-
127-
128/*-
129 * C++'s idea of a reinterpret_cast lacks sufficient cojones.-
130 */-
131template<typename TO, typename FROM>-
132inline TO bitwise_cast(FROM from)-
133{-
134 COMPILE_ASSERT(sizeof(TO) == sizeof(FROM), WTF_bitwise_cast_sizeof_casted_types_is_equal);-
135 union {-
136 FROM from;-
137 TO to;-
138 } u;-
139 u.from = from;-
140 return u.to;
never executed: return u.to;
0
141}-
142-
143template<typename To, typename From>-
144inline To safeCast(From value)-
145{-
146 ASSERT(isInBounds<To>(value));-
147 return static_cast<To>(value);
never executed: return static_cast<To>(value);
0
148}-
149-
150// Returns a count of the number of bits set in 'bits'.-
151inline size_t bitCount(unsigned bits)-
152{-
153 bits = bits - ((bits >> 1) & 0x55555555);-
154 bits = (bits & 0x33333333) + ((bits >> 2) & 0x33333333);-
155 return (((bits + (bits >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
never executed: return (((bits + (bits >> 4)) & 0xF0F0F0F) * 0x1010101) >> 24;
0
156}-
157-
158// Macro that returns a compile time constant with the length of an array, but gives an error if passed a non-array.-
159template<typename T, size_t Size> char (&ArrayLengthHelperFunction(T (&)[Size]))[Size];-
160// GCC needs some help to deduce a 0 length array.-
161#if COMPILER(GCC)-
162template<typename T> char (&ArrayLengthHelperFunction(T (&)[0]))[0];-
163#endif-
164#define WTF_ARRAY_LENGTH(array) sizeof(::WTF::ArrayLengthHelperFunction(array))-
165-
166// Efficient implementation that takes advantage of powers of two.-
167inline size_t roundUpToMultipleOf(size_t divisor, size_t x)-
168{-
169 Q_ASSERT(divisor && !(divisor & (divisor - 1)));-
170 size_t remainderMask = divisor - 1;-
171 return (x + remainderMask) & ~remainderMask;
executed 3626840 times by 153 tests: return (x + remainderMask) & ~remainderMask;
Executed by:
  • tst_bindingdependencyapi
  • tst_drawingmodes
  • tst_ecmascripttests
  • tst_examples
  • tst_flickableinterop
  • tst_multipointtoucharea_interop
  • tst_parserstress
  • tst_qjsengine
  • tst_qjsonbinding
  • tst_qjsvalue
  • tst_qjsvalueiterator
  • tst_qmlcachegen
  • tst_qmldiskcache
  • tst_qqmlapplicationengine
  • tst_qqmlbinding
  • tst_qqmlcomponent
  • tst_qqmlconnections
  • tst_qqmlconsole
  • tst_qqmlcontext
  • tst_qqmldebugclient
  • tst_qqmldebugjs
  • tst_qqmldebuglocal
  • tst_qqmldebugservice
  • tst_qqmlecmascript
  • tst_qqmlenginecleanup
  • ...
3626840
172}-
173template<size_t divisor> inline size_t roundUpToMultipleOf(size_t x)-
174{-
175 COMPILE_ASSERT(divisor && !(divisor & (divisor - 1)), divisor_is_a_power_of_two);-
176 return roundUpToMultipleOf(divisor, x);
never executed: return roundUpToMultipleOf(divisor, x);
0
177}-
178-
179enum BinarySearchMode {-
180 KeyMustBePresentInArray,-
181 KeyMightNotBePresentInArray,-
182 ReturnAdjacentElementIfKeyIsNotPresent-
183};-
184-
185template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey, BinarySearchMode mode>-
186inline ArrayElementType* binarySearchImpl(ArrayType& array, size_t size, KeyType key, const ExtractKey& extractKey = ExtractKey())-
187{-
188 size_t offset = 0;-
189 while (size > 1) {
size > 1Description
TRUEnever evaluated
FALSEnever evaluated
0
190 size_t pos = (size - 1) >> 1;-
191 KeyType val = extractKey(&array[offset + pos]);-
192 -
193 if (val == key)
val == keyDescription
TRUEnever evaluated
FALSEnever evaluated
0
194 return &array[offset + pos];
never executed: return &array[offset + pos];
0
195 // The item we are looking for is smaller than the item being check; reduce the value of 'size',-
196 // chopping off the right hand half of the array.-
197 if (key < val)
key < valDescription
TRUEnever evaluated
FALSEnever evaluated
0
198 size = pos;
never executed: size = pos;
0
199 // Discard all values in the left hand half of the array, up to and including the item at pos.-
200 else {-
201 size -= (pos + 1);-
202 offset += (pos + 1);-
203 }
never executed: end of block
0
204-
205 ASSERT(mode != KeyMustBePresentInArray || size);-
206 }
never executed: end of block
0
207 -
208 if (mode == KeyMightNotBePresentInArray && !size)
mode == KeyMig...PresentInArrayDescription
TRUEnever evaluated
FALSEnever evaluated
!sizeDescription
TRUEnever evaluated
FALSEnever evaluated
0
209 return 0;
never executed: return 0;
0
210 -
211 ArrayElementType* result = &array[offset];-
212-
213 if (mode == KeyMightNotBePresentInArray && key != extractKey(result))
mode == KeyMig...PresentInArrayDescription
TRUEnever evaluated
FALSEnever evaluated
key != extractKey(result)Description
TRUEnever evaluated
FALSEnever evaluated
0
214 return 0;
never executed: return 0;
0
215-
216 if (mode == KeyMustBePresentInArray) {
mode == KeyMus...PresentInArrayDescription
TRUEnever evaluated
FALSEnever evaluated
0
217 ASSERT(size == 1);-
218 ASSERT(key == extractKey(result));-
219 }
never executed: end of block
0
220-
221 return result;
never executed: return result;
0
222}-
223-
224// If the element is not found, crash if asserts are enabled, and behave like approximateBinarySearch in release builds.-
225template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
226inline ArrayElementType* binarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
227{-
228 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(array, size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(array, size, key, extractKey);
0
229}-
230-
231// Return zero if the element is not found.-
232template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
233inline ArrayElementType* tryBinarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
234{-
235 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(array, size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(array, size, key, extractKey);
0
236}-
237-
238// Return the element that is either to the left, or the right, of where the element would have been found.-
239template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
240inline ArrayElementType* approximateBinarySearch(ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
241{-
242 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(array, size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(array, size, key, extractKey);
0
243}-
244-
245// Variants of the above that use const.-
246template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
247inline ArrayElementType* binarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
248{-
249 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMustBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey);
0
250}-
251template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
252inline ArrayElementType* tryBinarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
253{-
254 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, KeyMightNotBePresentInArray>(const_cast<ArrayType&>(array), size, key, extractKey);
0
255}-
256template<typename ArrayElementType, typename KeyType, typename ArrayType, typename ExtractKey>-
257inline ArrayElementType* approximateBinarySearch(const ArrayType& array, size_t size, KeyType key, ExtractKey extractKey = ExtractKey())-
258{-
259 return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(const_cast<ArrayType&>(array), size, key, extractKey);
never executed: return binarySearchImpl<ArrayElementType, KeyType, ArrayType, ExtractKey, ReturnAdjacentElementIfKeyIsNotPresent>(const_cast<ArrayType&>(array), size, key, extractKey);
0
260}-
261-
262} // namespace WTF-
263-
264// This version of placement new omits a 0 check.-
265enum NotNullTag { NotNull };-
266inline void* operator new(size_t, NotNullTag, void* location)-
267{-
268 ASSERT(location);-
269 return location;
never executed: return location;
0
270}-
271-
272using WTF::KB;-
273using WTF::MB;-
274using WTF::isPointerAligned;-
275using WTF::is8ByteAligned;-
276using WTF::binarySearch;-
277using WTF::tryBinarySearch;-
278using WTF::approximateBinarySearch;-
279using WTF::bitwise_cast;-
280using WTF::safeCast;-
281-
282#endif // WTF_StdLibExtras_h-
Source codeSwitch to Preprocessed file

Generated by Squish Coco 4.2.0