LMMS
Loading...
Searching...
No Matches
juce_ArrayBase.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the JUCE library.
5 Copyright (c) 2022 - Raw Material Software Limited
6
7 JUCE is an open source library subject to commercial or open-source
8 licensing.
9
10 The code included in this file is provided under the terms of the ISC license
11 http://www.isc.org/downloads/software-support-policy/isc-license. Permission
12 To use, copy, modify, and/or distribute this software for any purpose with or
13 without fee is hereby granted provided that the above copyright notice and
14 this permission notice appear in all copies.
15
16 JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER
17 EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE
18 DISCLAIMED.
19
20 ==============================================================================
21*/
22
23namespace juce
24{
25
39template <class ElementType, class TypeOfCriticalSectionToUse>
40class ArrayBase : public TypeOfCriticalSectionToUse
41{
42private:
44
45 template <class OtherElementType, class OtherCriticalSection>
46 using AllowConversion = typename std::enable_if<! std::is_same<std::tuple<ElementType, TypeOfCriticalSectionToUse>,
47 std::tuple<OtherElementType, OtherCriticalSection>>::value>::type;
48
49public:
50 //==============================================================================
51 ArrayBase() = default;
52
54 {
55 clear();
56 }
57
59 : elements (std::move (other.elements)),
60 numAllocated (other.numAllocated),
61 numUsed (other.numUsed)
62 {
63 other.numAllocated = 0;
64 other.numUsed = 0;
65 }
66
67 ArrayBase& operator= (ArrayBase&& other) noexcept
68 {
69 if (this != &other)
70 {
71 auto tmp (std::move (other));
72 swapWith (tmp);
73 }
74
75 return *this;
76 }
77
83 template <class OtherElementType,
84 class OtherCriticalSection,
85 typename = AllowConversion<OtherElementType, OtherCriticalSection>>
87 : elements (std::move (other.elements)),
88 numAllocated (other.numAllocated),
89 numUsed (other.numUsed)
90 {
91 other.numAllocated = 0;
92 other.numUsed = 0;
93 }
94
100 template <class OtherElementType,
101 class OtherCriticalSection,
102 typename = AllowConversion<OtherElementType, OtherCriticalSection>>
104 {
105 // No need to worry about assignment to *this, because 'other' must be of a different type.
106 elements = std::move (other.elements);
107 numAllocated = other.numAllocated;
108 numUsed = other.numUsed;
109
110 other.numAllocated = 0;
111 other.numUsed = 0;
112
113 return *this;
114 }
115
116 //==============================================================================
117 template <class OtherArrayType>
118 bool operator== (const OtherArrayType& other) const noexcept
119 {
120 if (size() != (int) other.size())
121 return false;
122
123 auto* e = begin();
124
125 for (auto& o : other)
126 if (! (*e++ == o))
127 return false;
128
129 return true;
130 }
131
132 template <class OtherArrayType>
133 bool operator!= (const OtherArrayType& other) const noexcept
134 {
135 return ! operator== (other);
136 }
137
138 //==============================================================================
139 inline ElementType& operator[] (const int index) noexcept
140 {
141 jassert (elements != nullptr);
143 return elements[index];
144 }
145
146 inline const ElementType& operator[] (const int index) const noexcept
147 {
148 jassert (elements != nullptr);
150 return elements[index];
151 }
152
153 inline ElementType getValueWithDefault (const int index) const noexcept
154 {
155 return isPositiveAndBelow (index, numUsed) ? elements[index] : ElementType();
156 }
157
158 inline ElementType getFirst() const noexcept
159 {
160 return numUsed > 0 ? elements[0] : ElementType();
161 }
162
163 inline ElementType getLast() const noexcept
164 {
165 return numUsed > 0 ? elements[numUsed - 1] : ElementType();
166 }
167
168 //==============================================================================
169 inline ElementType* begin() noexcept
170 {
171 return elements;
172 }
173
174 inline const ElementType* begin() const noexcept
175 {
176 return elements;
177 }
178
179 inline ElementType* end() noexcept
180 {
181 return elements + numUsed;
182 }
183
184 inline const ElementType* end() const noexcept
185 {
186 return elements + numUsed;
187 }
188
189 inline ElementType* data() noexcept
190 {
191 return elements;
192 }
193
194 inline const ElementType* data() const noexcept
195 {
196 return elements;
197 }
198
199 inline int size() const noexcept
200 {
201 return numUsed;
202 }
203
205 {
206 return numAllocated;
207 }
208
209 //==============================================================================
210 void setAllocatedSize (int numElements)
211 {
212 jassert (numElements >= numUsed);
213
214 if (numAllocated != numElements)
215 {
216 if (numElements > 0)
217 setAllocatedSizeInternal (numElements);
218 else
219 elements.free();
220 }
221
222 numAllocated = numElements;
223 }
224
225 void ensureAllocatedSize (int minNumElements)
226 {
227 if (minNumElements > numAllocated)
228 setAllocatedSize ((minNumElements + minNumElements / 2 + 8) & ~7);
229
230 jassert (numAllocated <= 0 || elements != nullptr);
231 }
232
233 void shrinkToNoMoreThan (int maxNumElements)
234 {
235 if (maxNumElements < numAllocated)
236 setAllocatedSize (maxNumElements);
237 }
238
239 void clear()
240 {
241 for (int i = 0; i < numUsed; ++i)
242 elements[i].~ElementType();
243
244 numUsed = 0;
245 }
246
247 //==============================================================================
248 void swapWith (ArrayBase& other) noexcept
249 {
250 elements.swapWith (other.elements);
251 std::swap (numAllocated, other.numAllocated);
252 std::swap (numUsed, other.numUsed);
253 }
254
255 //==============================================================================
256 void add (const ElementType& newElement)
257 {
258 addImpl (newElement);
259 }
260
261 void add (ElementType&& newElement)
262 {
263 addImpl (std::move (newElement));
264 }
265
266 template <typename... OtherElements>
267 void add (const ElementType& firstNewElement, OtherElements&&... otherElements)
268 {
269 addImpl (firstNewElement, std::forward<OtherElements> (otherElements)...);
270 }
271
272 template <typename... OtherElements>
273 void add (ElementType&& firstNewElement, OtherElements&&... otherElements)
274 {
275 addImpl (std::move (firstNewElement), std::forward<OtherElements> (otherElements)...);
276 }
277
278 //==============================================================================
279 template <typename Type>
280 void addArray (const Type* elementsToAdd, int numElementsToAdd)
281 {
282 ensureAllocatedSize (numUsed + numElementsToAdd);
283 addArrayInternal (elementsToAdd, numElementsToAdd);
284 numUsed += numElementsToAdd;
285 }
286
287 template <typename TypeToCreateFrom>
288 void addArray (const std::initializer_list<TypeToCreateFrom>& items)
289 {
290 ensureAllocatedSize (numUsed + (int) items.size());
291
292 for (auto& item : items)
293 new (elements + numUsed++) ElementType (item);
294 }
295
296 template <class OtherArrayType>
297 void addArray (const OtherArrayType& arrayToAddFrom)
298 {
299 jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!
300 ensureAllocatedSize (numUsed + (int) arrayToAddFrom.size());
301
302 for (auto& e : arrayToAddFrom)
304 }
305
306 template <class OtherArrayType>
307 typename std::enable_if<! std::is_pointer<OtherArrayType>::value, int>::type
308 addArray (const OtherArrayType& arrayToAddFrom,
309 int startIndex, int numElementsToAdd = -1)
310 {
311 jassert ((const void*) this != (const void*) &arrayToAddFrom); // can't add from our own elements!
312
313 if (startIndex < 0)
314 {
316 startIndex = 0;
317 }
318
319 if (numElementsToAdd < 0 || startIndex + numElementsToAdd > (int) arrayToAddFrom.size())
320 numElementsToAdd = (int) arrayToAddFrom.size() - startIndex;
321
322 addArray (arrayToAddFrom.data() + startIndex, numElementsToAdd);
323
324 return numElementsToAdd;
325 }
326
327 //==============================================================================
328 void insert (int indexToInsertAt, ParameterType newElement, int numberOfTimesToInsertIt)
329 {
330 checkSourceIsNotAMember (newElement);
331 auto* space = createInsertSpace (indexToInsertAt, numberOfTimesToInsertIt);
332
333 for (int i = 0; i < numberOfTimesToInsertIt; ++i)
334 new (space++) ElementType (newElement);
335
336 numUsed += numberOfTimesToInsertIt;
337 }
338
339 void insertArray (int indexToInsertAt, const ElementType* newElements, int numberOfElements)
340 {
341 auto* space = createInsertSpace (indexToInsertAt, numberOfElements);
342
343 for (int i = 0; i < numberOfElements; ++i)
344 new (space++) ElementType (*(newElements++));
345
346 numUsed += numberOfElements;
347 }
348
349 //==============================================================================
350 void removeElements (int indexToRemoveAt, int numElementsToRemove)
351 {
352 jassert (indexToRemoveAt >= 0);
353 jassert (numElementsToRemove >= 0);
354 jassert (indexToRemoveAt + numElementsToRemove <= numUsed);
355
356 if (numElementsToRemove > 0)
357 {
358 removeElementsInternal (indexToRemoveAt, numElementsToRemove);
359 numUsed -= numElementsToRemove;
360 }
361 }
362
363 //==============================================================================
364 void swap (int index1, int index2)
365 {
366 if (isPositiveAndBelow (index1, numUsed)
367 && isPositiveAndBelow (index2, numUsed))
368 {
369 std::swap (elements[index1],
370 elements[index2]);
371 }
372 }
373
374 //==============================================================================
375 void move (int currentIndex, int newIndex) noexcept
376 {
377 if (isPositiveAndBelow (currentIndex, numUsed))
378 {
379 if (! isPositiveAndBelow (newIndex, numUsed))
380 newIndex = numUsed - 1;
381
382 moveInternal (currentIndex, newIndex);
383 }
384 }
385
386private:
387 //==============================================================================
388 template <typename T>
389 #if defined(__GNUC__) && __GNUC__ < 5 && ! defined(__clang__)
390 using IsTriviallyCopyable = std::is_scalar<T>;
391 #else
392 using IsTriviallyCopyable = std::is_trivially_copyable<T>;
393 #endif
394
395 template <typename T>
396 using TriviallyCopyableVoid = typename std::enable_if<IsTriviallyCopyable<T>::value, void>::type;
397
398 template <typename T>
399 using NonTriviallyCopyableVoid = typename std::enable_if<! IsTriviallyCopyable<T>::value, void>::type;
400
401 //==============================================================================
402 template <typename T = ElementType>
403 TriviallyCopyableVoid<T> addArrayInternal (const ElementType* otherElements, int numElements)
404 {
405 if (numElements > 0)
406 memcpy (elements + numUsed, otherElements, (size_t) numElements * sizeof (ElementType));
407 }
408
409 template <typename Type, typename T = ElementType>
410 TriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)
411 {
412 auto* start = elements + numUsed;
413
414 while (--numElements >= 0)
415 new (start++) ElementType (*(otherElements++));
416 }
417
418 template <typename Type, typename T = ElementType>
419 NonTriviallyCopyableVoid<T> addArrayInternal (const Type* otherElements, int numElements)
420 {
421 auto* start = elements + numUsed;
422
423 while (--numElements >= 0)
424 new (start++) ElementType (*(otherElements++));
425 }
426
427 //==============================================================================
428 template <typename T = ElementType>
430 {
431 elements.realloc ((size_t) numElements);
432 }
433
434 template <typename T = ElementType>
436 {
437 HeapBlock<ElementType> newElements (numElements);
438
439 for (int i = 0; i < numUsed; ++i)
440 {
441 new (newElements + i) ElementType (std::move (elements[i]));
442 elements[i].~ElementType();
443 }
444
445 elements = std::move (newElements);
446 }
447
448 //==============================================================================
449 ElementType* createInsertSpace (int indexToInsertAt, int numElements)
450 {
451 ensureAllocatedSize (numUsed + numElements);
452
453 if (! isPositiveAndBelow (indexToInsertAt, numUsed))
454 return elements + numUsed;
455
456 createInsertSpaceInternal (indexToInsertAt, numElements);
457
458 return elements + indexToInsertAt;
459 }
460
461 template <typename T = ElementType>
462 TriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)
463 {
464 auto* start = elements + indexToInsertAt;
465 auto numElementsToShift = numUsed - indexToInsertAt;
466 memmove (start + numElements, start, (size_t) numElementsToShift * sizeof (ElementType));
467 }
468
469 template <typename T = ElementType>
470 NonTriviallyCopyableVoid<T> createInsertSpaceInternal (int indexToInsertAt, int numElements)
471 {
472 auto* end = elements + numUsed;
473 auto* newEnd = end + numElements;
474 auto numElementsToShift = numUsed - indexToInsertAt;
475
476 for (int i = 0; i < numElementsToShift; ++i)
477 {
478 new (--newEnd) ElementType (std::move (*(--end)));
479 end->~ElementType();
480 }
481 }
482
483 //==============================================================================
484 template <typename T = ElementType>
485 TriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)
486 {
487 auto* start = elements + indexToRemoveAt;
488 auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);
489 memmove (start, start + numElementsToRemove, (size_t) numElementsToShift * sizeof (ElementType));
490 }
491
492 template <typename T = ElementType>
493 NonTriviallyCopyableVoid<T> removeElementsInternal (int indexToRemoveAt, int numElementsToRemove)
494 {
495 auto numElementsToShift = numUsed - (indexToRemoveAt + numElementsToRemove);
496 auto* destination = elements + indexToRemoveAt;
497 auto* source = destination + numElementsToRemove;
498
499 for (int i = 0; i < numElementsToShift; ++i)
500 moveAssignElement (destination++, std::move (*(source++)));
501
502 for (int i = 0; i < numElementsToRemove; ++i)
503 (destination++)->~ElementType();
504 }
505
506 //==============================================================================
507 template <typename T = ElementType>
508 TriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept
509 {
510 char tempCopy[sizeof (ElementType)];
511 memcpy (tempCopy, elements + currentIndex, sizeof (ElementType));
512
513 if (newIndex > currentIndex)
514 {
515 memmove (elements + currentIndex,
516 elements + currentIndex + 1,
517 (size_t) (newIndex - currentIndex) * sizeof (ElementType));
518 }
519 else
520 {
521 memmove (elements + newIndex + 1,
522 elements + newIndex,
523 (size_t) (currentIndex - newIndex) * sizeof (ElementType));
524 }
525
526 memcpy (elements + newIndex, tempCopy, sizeof (ElementType));
527 }
528
529 template <typename T = ElementType>
530 NonTriviallyCopyableVoid<T> moveInternal (int currentIndex, int newIndex) noexcept
531 {
532 auto* e = elements + currentIndex;
533 ElementType tempCopy (std::move (*e));
534 auto delta = newIndex - currentIndex;
535
536 if (delta > 0)
537 {
538 for (int i = 0; i < delta; ++i)
539 {
540 moveAssignElement (e, std::move (*(e + 1)));
541 ++e;
542 }
543 }
544 else
545 {
546 for (int i = 0; i < -delta; ++i)
547 {
548 moveAssignElement (e, std::move (*(e - 1)));
549 --e;
550 }
551 }
552
553 moveAssignElement (e, std::move (tempCopy));
554 }
555
556 //==============================================================================
557 template <typename... Elements>
558 void addImpl (Elements&&... toAdd)
559 {
560 ignoreUnused (std::initializer_list<int> { (((void) checkSourceIsNotAMember (toAdd)), 0)... });
561 ensureAllocatedSize (numUsed + (int) sizeof... (toAdd));
562 addAssumingCapacityIsReady (std::forward<Elements> (toAdd)...);
563 }
564
565 template <typename... Elements>
566 void addAssumingCapacityIsReady (Elements&&... toAdd)
567 {
568 ignoreUnused (std::initializer_list<int> { ((void) (new (elements + numUsed++) ElementType (std::forward<Elements> (toAdd))), 0)... });
569 }
570
571 //==============================================================================
572 template <typename T = ElementType>
573 typename std::enable_if<std::is_move_assignable<T>::value, void>::type
574 moveAssignElement (ElementType* destination, ElementType&& source)
575 {
576 *destination = std::move (source);
577 }
578
579 template <typename T = ElementType>
580 typename std::enable_if<! std::is_move_assignable<T>::value, void>::type
581 moveAssignElement (ElementType* destination, ElementType&& source)
582 {
583 destination->~ElementType();
584 new (destination) ElementType (std::move (source));
585 }
586
587 void checkSourceIsNotAMember (const ElementType& element)
588 {
589 // when you pass a reference to an existing element into a method like add() which
590 // may need to reallocate the array to make more space, the incoming reference may
591 // be deleted indirectly during the reallocation operation! To work around this,
592 // make a local copy of the item you're trying to add (and maybe use std::move to
593 // move it into the add() method to avoid any extra overhead)
594 jassertquiet (std::addressof (element) < begin() || end() <= std::addressof (element));
595 }
596
597 //==============================================================================
599 int numAllocated = 0, numUsed = 0;
600
601 template <class OtherElementType, class OtherCriticalSection>
602 friend class ArrayBase;
603
605};
606
607} // namespace juce
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
ArrayBase()=default
ElementType getLast() const noexcept
Definition juce_ArrayBase.h:163
void add(const ElementType &newElement)
Definition juce_ArrayBase.h:256
ElementType getFirst() const noexcept
Definition juce_ArrayBase.h:158
ArrayBase(ArrayBase &&other) noexcept
Definition juce_ArrayBase.h:58
NonTriviallyCopyableVoid< T > addArrayInternal(const Type *otherElements, int numElements)
Definition juce_ArrayBase.h:419
typename std::enable_if< IsTriviallyCopyable< T >::value, void >::type TriviallyCopyableVoid
Definition juce_ArrayBase.h:396
std::enable_if<!std::is_pointer< OtherArrayType >::value, int >::type addArray(const OtherArrayType &arrayToAddFrom, int startIndex, int numElementsToAdd=-1)
Definition juce_ArrayBase.h:308
int numUsed
Definition juce_ArrayBase.h:599
friend class ArrayBase
Definition juce_ArrayBase.h:602
NonTriviallyCopyableVoid< T > removeElementsInternal(int indexToRemoveAt, int numElementsToRemove)
Definition juce_ArrayBase.h:493
HeapBlock< ElementType > elements
Definition juce_ArrayBase.h:598
void setAllocatedSize(int numElements)
Definition juce_ArrayBase.h:210
TriviallyCopyableVoid< T > addArrayInternal(const Type *otherElements, int numElements)
Definition juce_ArrayBase.h:410
std::is_trivially_copyable< T > IsTriviallyCopyable
Definition juce_ArrayBase.h:392
void addArray(const Type *elementsToAdd, int numElementsToAdd)
Definition juce_ArrayBase.h:280
ElementType * data() noexcept
Definition juce_ArrayBase.h:189
typename std::enable_if<! IsTriviallyCopyable< T >::value, void >::type NonTriviallyCopyableVoid
Definition juce_ArrayBase.h:399
typename std::enable_if<! std::is_same< std::tuple< ElementType, TypeOfCriticalSectionToUse >, std::tuple< OtherElementType, OtherCriticalSection > >::value >::type AllowConversion
Definition juce_ArrayBase.h:46
void swap(int index1, int index2)
Definition juce_ArrayBase.h:364
ArrayBase(ArrayBase< OtherElementType, OtherCriticalSection > &&other) noexcept
Definition juce_ArrayBase.h:86
void add(ElementType &&newElement)
Definition juce_ArrayBase.h:261
std::enable_if< std::is_move_assignable< T >::value, void >::type moveAssignElement(ElementType *destination, ElementType &&source)
Definition juce_ArrayBase.h:574
~ArrayBase()
Definition juce_ArrayBase.h:53
void insert(int indexToInsertAt, ParameterType newElement, int numberOfTimesToInsertIt)
Definition juce_ArrayBase.h:328
void add(ElementType &&firstNewElement, OtherElements &&... otherElements)
Definition juce_ArrayBase.h:273
ElementType * begin() noexcept
Definition juce_ArrayBase.h:169
void insertArray(int indexToInsertAt, const ElementType *newElements, int numberOfElements)
Definition juce_ArrayBase.h:339
void addImpl(Elements &&... toAdd)
Definition juce_ArrayBase.h:558
ElementType getValueWithDefault(const int index) const noexcept
Definition juce_ArrayBase.h:153
void swapWith(ArrayBase &other) noexcept
Definition juce_ArrayBase.h:248
void checkSourceIsNotAMember(const ElementType &element)
Definition juce_ArrayBase.h:587
void removeElements(int indexToRemoveAt, int numElementsToRemove)
Definition juce_ArrayBase.h:350
typename TypeHelpers::ParameterType< ElementType >::type ParameterType
Definition juce_ArrayBase.h:43
TriviallyCopyableVoid< T > createInsertSpaceInternal(int indexToInsertAt, int numElements)
Definition juce_ArrayBase.h:462
void addArray(const std::initializer_list< TypeToCreateFrom > &items)
Definition juce_ArrayBase.h:288
TriviallyCopyableVoid< T > setAllocatedSizeInternal(int numElements)
Definition juce_ArrayBase.h:429
int size() const noexcept
Definition juce_ArrayBase.h:199
void move(int currentIndex, int newIndex) noexcept
Definition juce_ArrayBase.h:375
int numAllocated
Definition juce_ArrayBase.h:599
TriviallyCopyableVoid< T > removeElementsInternal(int indexToRemoveAt, int numElementsToRemove)
Definition juce_ArrayBase.h:485
const ElementType * begin() const noexcept
Definition juce_ArrayBase.h:174
int capacity() const noexcept
Definition juce_ArrayBase.h:204
void addArray(const OtherArrayType &arrayToAddFrom)
Definition juce_ArrayBase.h:297
const ElementType * end() const noexcept
Definition juce_ArrayBase.h:184
void add(const ElementType &firstNewElement, OtherElements &&... otherElements)
Definition juce_ArrayBase.h:267
void ensureAllocatedSize(int minNumElements)
Definition juce_ArrayBase.h:225
TriviallyCopyableVoid< T > addArrayInternal(const ElementType *otherElements, int numElements)
Definition juce_ArrayBase.h:403
const ElementType * data() const noexcept
Definition juce_ArrayBase.h:194
NonTriviallyCopyableVoid< T > moveInternal(int currentIndex, int newIndex) noexcept
Definition juce_ArrayBase.h:530
ElementType * createInsertSpace(int indexToInsertAt, int numElements)
Definition juce_ArrayBase.h:449
NonTriviallyCopyableVoid< T > setAllocatedSizeInternal(int numElements)
Definition juce_ArrayBase.h:435
std::enable_if<!std::is_move_assignable< T >::value, void >::type moveAssignElement(ElementType *destination, ElementType &&source)
Definition juce_ArrayBase.h:581
NonTriviallyCopyableVoid< T > createInsertSpaceInternal(int indexToInsertAt, int numElements)
Definition juce_ArrayBase.h:470
ElementType * end() noexcept
Definition juce_ArrayBase.h:179
TriviallyCopyableVoid< T > moveInternal(int currentIndex, int newIndex) noexcept
Definition juce_ArrayBase.h:508
void clear()
Definition juce_ArrayBase.h:239
void addAssumingCapacityIsReady(Elements &&... toAdd)
Definition juce_ArrayBase.h:566
void shrinkToNoMoreThan(int maxNumElements)
Definition juce_ArrayBase.h:233
Definition juce_HeapBlock.h:87
* e
Definition inflate.c:1404
register unsigned i
Definition inflate.c:1575
static PuglViewHint int value
Definition pugl.h:1708
virtual ASIOError start()=0
#define jassert(expression)
#define jassertquiet(expression)
#define JUCE_DECLARE_NON_COPYABLE(className)
#define jassertfalse
Definition carla_juce.cpp:31
void ignoreUnused(Types &&...) noexcept
Definition juce_MathsFunctions.h:333
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Definition juce_MathsFunctions.h:279
const Type & type
Definition juce_MathsFunctions.h:632
memcpy(hh, h, RAND_HEAD_LEN)
ulg size
Definition extract.c:2350
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137