| @@ -3416,8 +3416,7 @@ MemoryBlock::MemoryBlock() throw() | |||
| { | |||
| } | |||
| MemoryBlock::MemoryBlock (const size_t initialSize, | |||
| const bool initialiseToZero) throw() | |||
| MemoryBlock::MemoryBlock (const size_t initialSize, const bool initialiseToZero) | |||
| { | |||
| if (initialSize > 0) | |||
| { | |||
| @@ -3430,7 +3429,7 @@ MemoryBlock::MemoryBlock (const size_t initialSize, | |||
| } | |||
| } | |||
| MemoryBlock::MemoryBlock (const MemoryBlock& other) throw() | |||
| MemoryBlock::MemoryBlock (const MemoryBlock& other) | |||
| : size (other.size) | |||
| { | |||
| if (size > 0) | |||
| @@ -3441,8 +3440,7 @@ MemoryBlock::MemoryBlock (const MemoryBlock& other) throw() | |||
| } | |||
| } | |||
| MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, | |||
| const size_t sizeInBytes) throw() | |||
| MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, const size_t sizeInBytes) | |||
| : size (jmax ((size_t) 0, sizeInBytes)) | |||
| { | |||
| jassert (sizeInBytes >= 0); | |||
| @@ -3464,7 +3462,7 @@ MemoryBlock::~MemoryBlock() throw() | |||
| jassert (size == 0 || data != 0); // non-zero size but no data allocated? | |||
| } | |||
| MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) throw() | |||
| MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) | |||
| { | |||
| if (this != &other) | |||
| { | |||
| @@ -3492,8 +3490,7 @@ bool MemoryBlock::matches (const void* dataToCompare, size_t dataSize) const thr | |||
| } | |||
| // this will resize the block to this size | |||
| void MemoryBlock::setSize (const size_t newSize, | |||
| const bool initialiseToZero) throw() | |||
| void MemoryBlock::setSize (const size_t newSize, const bool initialiseToZero) | |||
| { | |||
| if (size != newSize) | |||
| { | |||
| @@ -3521,8 +3518,7 @@ void MemoryBlock::setSize (const size_t newSize, | |||
| } | |||
| } | |||
| void MemoryBlock::ensureSize (const size_t minimumSize, | |||
| const bool initialiseToZero) throw() | |||
| void MemoryBlock::ensureSize (const size_t minimumSize, const bool initialiseToZero) | |||
| { | |||
| if (size < minimumSize) | |||
| setSize (minimumSize, initialiseToZero); | |||
| @@ -3539,8 +3535,7 @@ void MemoryBlock::fillWith (const uint8 value) throw() | |||
| memset (data, (int) value, size); | |||
| } | |||
| void MemoryBlock::append (const void* const srcData, | |||
| const size_t numBytes) throw() | |||
| void MemoryBlock::append (const void* const srcData, const size_t numBytes) | |||
| { | |||
| if (numBytes > 0) | |||
| { | |||
| @@ -3592,7 +3587,7 @@ void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const throw() | |||
| memcpy (d, data + offset, num); | |||
| } | |||
| void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) throw() | |||
| void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) | |||
| { | |||
| if (startByte < 0) | |||
| { | |||
| @@ -3614,7 +3609,7 @@ void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) thro | |||
| } | |||
| } | |||
| const String MemoryBlock::toString() const throw() | |||
| const String MemoryBlock::toString() const | |||
| { | |||
| return String (static_cast <const char*> (getData()), size); | |||
| } | |||
| @@ -3666,7 +3661,7 @@ void MemoryBlock::setBitRange (const size_t bitRangeStart, size_t numBits, int b | |||
| } | |||
| } | |||
| void MemoryBlock::loadFromHexString (const String& hex) throw() | |||
| void MemoryBlock::loadFromHexString (const String& hex) | |||
| { | |||
| ensureSize (hex.length() >> 1); | |||
| char* dest = data; | |||
| @@ -3713,7 +3708,7 @@ void MemoryBlock::loadFromHexString (const String& hex) throw() | |||
| const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; | |||
| const String MemoryBlock::toBase64Encoding() const throw() | |||
| const String MemoryBlock::toBase64Encoding() const | |||
| { | |||
| const size_t numChars = ((size << 3) + 5) / 6; | |||
| @@ -3733,7 +3728,7 @@ const String MemoryBlock::toBase64Encoding() const throw() | |||
| return destString; | |||
| } | |||
| bool MemoryBlock::fromBase64Encoding (const String& s) throw() | |||
| bool MemoryBlock::fromBase64Encoding (const String& s) | |||
| { | |||
| const int startPos = s.indexOfChar ('.') + 1; | |||
| @@ -4869,18 +4869,17 @@ public: | |||
| @param initialiseToZero whether to clear the memory or just leave it uninitialised | |||
| */ | |||
| MemoryBlock (const size_t initialSize, | |||
| const bool initialiseToZero = false) throw(); | |||
| bool initialiseToZero = false); | |||
| /** Creates a copy of another memory block. */ | |||
| MemoryBlock (const MemoryBlock& other) throw(); | |||
| MemoryBlock (const MemoryBlock& other); | |||
| /** Creates a memory block using a copy of a block of data. | |||
| @param dataToInitialiseFrom some data to copy into this block | |||
| @param sizeInBytes how much space to use | |||
| */ | |||
| MemoryBlock (const void* dataToInitialiseFrom, | |||
| const size_t sizeInBytes) throw(); | |||
| MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes); | |||
| /** Destructor. */ | |||
| ~MemoryBlock() throw(); | |||
| @@ -4889,7 +4888,7 @@ public: | |||
| This block will be resized and copied to exactly match the other one. | |||
| */ | |||
| MemoryBlock& operator= (const MemoryBlock& other) throw(); | |||
| MemoryBlock& operator= (const MemoryBlock& other); | |||
| /** Compares two memory blocks. | |||
| @@ -4937,7 +4936,7 @@ public: | |||
| @see ensureSize | |||
| */ | |||
| void setSize (const size_t newSize, | |||
| const bool initialiseNewSpaceToZero = false) throw(); | |||
| bool initialiseNewSpaceToZero = false); | |||
| /** Increases the block's size only if it's smaller than a given size. | |||
| @@ -4949,20 +4948,19 @@ public: | |||
| @see setSize | |||
| */ | |||
| void ensureSize (const size_t minimumSize, | |||
| const bool initialiseNewSpaceToZero = false) throw(); | |||
| bool initialiseNewSpaceToZero = false); | |||
| /** Fills the entire memory block with a repeated byte value. | |||
| This is handy for clearing a block of memory to zero. | |||
| */ | |||
| void fillWith (const uint8 valueToUse) throw(); | |||
| void fillWith (uint8 valueToUse) throw(); | |||
| /** Adds another block of data to the end of this one. | |||
| This block's size will be increased accordingly. | |||
| */ | |||
| void append (const void* data, | |||
| const size_t numBytes) throw(); | |||
| void append (const void* data, size_t numBytes); | |||
| /** Exchanges the contents of this and another memory block. | |||
| No actual copying is required for this, so it's very fast. | |||
| @@ -4998,11 +4996,11 @@ public: | |||
| If the range specified goes beyond the size of the block, it will be clipped. | |||
| */ | |||
| void removeSection (size_t startByte, size_t numBytesToRemove) throw(); | |||
| void removeSection (size_t startByte, size_t numBytesToRemove); | |||
| /** Attempts to parse the contents of the block as a zero-terminated string of 8-bit | |||
| characters in the system's default encoding. */ | |||
| const String toString() const throw(); | |||
| const String toString() const; | |||
| /** Parses a string of hexadecimal numbers and writes this data into the memory block. | |||
| @@ -5011,7 +5009,7 @@ public: | |||
| @see String::toHexString() | |||
| */ | |||
| void loadFromHexString (const String& sourceHexString) throw(); | |||
| void loadFromHexString (const String& sourceHexString); | |||
| /** Sets a number of bits in the memory block, treating it as a long binary sequence. */ | |||
| void setBitRange (size_t bitRangeStart, | |||
| @@ -5029,7 +5027,7 @@ public: | |||
| @see fromBase64Encoding | |||
| */ | |||
| const String toBase64Encoding() const throw(); | |||
| const String toBase64Encoding() const; | |||
| /** Takes a string of encoded characters and turns it into binary data. | |||
| @@ -5038,7 +5036,7 @@ public: | |||
| @see toBase64Encoding | |||
| */ | |||
| bool fromBase64Encoding (const String& encodedString) throw(); | |||
| bool fromBase64Encoding (const String& encodedString); | |||
| juce_UseDebuggingNewOperator | |||
| @@ -7024,26 +7022,33 @@ public: | |||
| { | |||
| if (indexToChange >= 0) | |||
| { | |||
| ScopedPointer <ObjectClass> toDelete; | |||
| const ScopedLockType lock (getLock()); | |||
| ObjectClass* toDelete = 0; | |||
| if (indexToChange < numUsed) | |||
| { | |||
| if (deleteOldElement) | |||
| const ScopedLockType lock (getLock()); | |||
| if (indexToChange < numUsed) | |||
| { | |||
| toDelete = data.elements [indexToChange]; | |||
| if (deleteOldElement) | |||
| { | |||
| toDelete = data.elements [indexToChange]; | |||
| if (toDelete == newObject) | |||
| toDelete = 0; | |||
| } | |||
| if (toDelete == newObject) | |||
| toDelete = 0; | |||
| } | |||
| data.elements [indexToChange] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| else | |||
| { | |||
| data.ensureAllocatedSize (numUsed + 1); | |||
| data.elements [numUsed++] = const_cast <ObjectClass*> (newObject); | |||
| data.elements [indexToChange] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| else | |||
| { | |||
| data.ensureAllocatedSize (numUsed + 1); | |||
| data.elements [numUsed++] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| } | |||
| delete toDelete; // don't want to use a ScopedPointer here because if the | |||
| // object has a private destructor, both OwnedArray and | |||
| // ScopedPointer would need to be friend classes.. | |||
| } | |||
| } | |||
| @@ -7203,25 +7208,32 @@ public: | |||
| void remove (const int indexToRemove, | |||
| const bool deleteObject = true) | |||
| { | |||
| ScopedPointer <ObjectClass> toDelete; | |||
| const ScopedLockType lock (getLock()); | |||
| ObjectClass* toDelete = 0; | |||
| if (((unsigned int) indexToRemove) < (unsigned int) numUsed) | |||
| { | |||
| ObjectClass** const e = data.elements + indexToRemove; | |||
| const ScopedLockType lock (getLock()); | |||
| if (deleteObject) | |||
| toDelete = *e; | |||
| if (((unsigned int) indexToRemove) < (unsigned int) numUsed) | |||
| { | |||
| ObjectClass** const e = data.elements + indexToRemove; | |||
| --numUsed; | |||
| const int numToShift = numUsed - indexToRemove; | |||
| if (deleteObject) | |||
| toDelete = *e; | |||
| if (numToShift > 0) | |||
| memmove (e, e + 1, numToShift * sizeof (ObjectClass*)); | |||
| --numUsed; | |||
| const int numToShift = numUsed - indexToRemove; | |||
| if ((numUsed << 1) < data.numAllocated) | |||
| minimiseStorageOverheads(); | |||
| if (numToShift > 0) | |||
| memmove (e, e + 1, numToShift * sizeof (ObjectClass*)); | |||
| } | |||
| } | |||
| delete toDelete; // don't want to use a ScopedPointer here because if the | |||
| // object has a private destructor, both OwnedArray and | |||
| // ScopedPointer would need to be friend classes.. | |||
| if ((numUsed << 1) < data.numAllocated) | |||
| minimiseStorageOverheads(); | |||
| } | |||
| /** Removes and returns an object from the array without deleting it. | |||
| @@ -27,6 +27,7 @@ | |||
| #define __JUCE_SAMPLER_JUCEHEADER__ | |||
| #include "../../containers/juce_BigInteger.h" | |||
| #include "../../containers/juce_ScopedPointer.h" | |||
| #include "juce_Synthesiser.h" | |||
| @@ -36,8 +36,7 @@ MemoryBlock::MemoryBlock() throw() | |||
| { | |||
| } | |||
| MemoryBlock::MemoryBlock (const size_t initialSize, | |||
| const bool initialiseToZero) throw() | |||
| MemoryBlock::MemoryBlock (const size_t initialSize, const bool initialiseToZero) | |||
| { | |||
| if (initialSize > 0) | |||
| { | |||
| @@ -50,7 +49,7 @@ MemoryBlock::MemoryBlock (const size_t initialSize, | |||
| } | |||
| } | |||
| MemoryBlock::MemoryBlock (const MemoryBlock& other) throw() | |||
| MemoryBlock::MemoryBlock (const MemoryBlock& other) | |||
| : size (other.size) | |||
| { | |||
| if (size > 0) | |||
| @@ -61,8 +60,7 @@ MemoryBlock::MemoryBlock (const MemoryBlock& other) throw() | |||
| } | |||
| } | |||
| MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, | |||
| const size_t sizeInBytes) throw() | |||
| MemoryBlock::MemoryBlock (const void* const dataToInitialiseFrom, const size_t sizeInBytes) | |||
| : size (jmax ((size_t) 0, sizeInBytes)) | |||
| { | |||
| jassert (sizeInBytes >= 0); | |||
| @@ -84,7 +82,7 @@ MemoryBlock::~MemoryBlock() throw() | |||
| jassert (size == 0 || data != 0); // non-zero size but no data allocated? | |||
| } | |||
| MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) throw() | |||
| MemoryBlock& MemoryBlock::operator= (const MemoryBlock& other) | |||
| { | |||
| if (this != &other) | |||
| { | |||
| @@ -114,8 +112,7 @@ bool MemoryBlock::matches (const void* dataToCompare, size_t dataSize) const thr | |||
| //============================================================================== | |||
| // this will resize the block to this size | |||
| void MemoryBlock::setSize (const size_t newSize, | |||
| const bool initialiseToZero) throw() | |||
| void MemoryBlock::setSize (const size_t newSize, const bool initialiseToZero) | |||
| { | |||
| if (size != newSize) | |||
| { | |||
| @@ -143,8 +140,7 @@ void MemoryBlock::setSize (const size_t newSize, | |||
| } | |||
| } | |||
| void MemoryBlock::ensureSize (const size_t minimumSize, | |||
| const bool initialiseToZero) throw() | |||
| void MemoryBlock::ensureSize (const size_t minimumSize, const bool initialiseToZero) | |||
| { | |||
| if (size < minimumSize) | |||
| setSize (minimumSize, initialiseToZero); | |||
| @@ -162,8 +158,7 @@ void MemoryBlock::fillWith (const uint8 value) throw() | |||
| memset (data, (int) value, size); | |||
| } | |||
| void MemoryBlock::append (const void* const srcData, | |||
| const size_t numBytes) throw() | |||
| void MemoryBlock::append (const void* const srcData, const size_t numBytes) | |||
| { | |||
| if (numBytes > 0) | |||
| { | |||
| @@ -215,7 +210,7 @@ void MemoryBlock::copyTo (void* const dst, int offset, size_t num) const throw() | |||
| memcpy (d, data + offset, num); | |||
| } | |||
| void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) throw() | |||
| void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) | |||
| { | |||
| if (startByte < 0) | |||
| { | |||
| @@ -237,7 +232,7 @@ void MemoryBlock::removeSection (size_t startByte, size_t numBytesToRemove) thro | |||
| } | |||
| } | |||
| const String MemoryBlock::toString() const throw() | |||
| const String MemoryBlock::toString() const | |||
| { | |||
| return String (static_cast <const char*> (getData()), size); | |||
| } | |||
| @@ -291,7 +286,7 @@ void MemoryBlock::setBitRange (const size_t bitRangeStart, size_t numBits, int b | |||
| } | |||
| //============================================================================== | |||
| void MemoryBlock::loadFromHexString (const String& hex) throw() | |||
| void MemoryBlock::loadFromHexString (const String& hex) | |||
| { | |||
| ensureSize (hex.length() >> 1); | |||
| char* dest = data; | |||
| @@ -339,7 +334,7 @@ void MemoryBlock::loadFromHexString (const String& hex) throw() | |||
| //============================================================================== | |||
| const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; | |||
| const String MemoryBlock::toBase64Encoding() const throw() | |||
| const String MemoryBlock::toBase64Encoding() const | |||
| { | |||
| const size_t numChars = ((size << 3) + 5) / 6; | |||
| @@ -359,7 +354,7 @@ const String MemoryBlock::toBase64Encoding() const throw() | |||
| return destString; | |||
| } | |||
| bool MemoryBlock::fromBase64Encoding (const String& s) throw() | |||
| bool MemoryBlock::fromBase64Encoding (const String& s) | |||
| { | |||
| const int startPos = s.indexOfChar ('.') + 1; | |||
| @@ -48,18 +48,17 @@ public: | |||
| @param initialiseToZero whether to clear the memory or just leave it uninitialised | |||
| */ | |||
| MemoryBlock (const size_t initialSize, | |||
| const bool initialiseToZero = false) throw(); | |||
| bool initialiseToZero = false); | |||
| /** Creates a copy of another memory block. */ | |||
| MemoryBlock (const MemoryBlock& other) throw(); | |||
| MemoryBlock (const MemoryBlock& other); | |||
| /** Creates a memory block using a copy of a block of data. | |||
| @param dataToInitialiseFrom some data to copy into this block | |||
| @param sizeInBytes how much space to use | |||
| */ | |||
| MemoryBlock (const void* dataToInitialiseFrom, | |||
| const size_t sizeInBytes) throw(); | |||
| MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes); | |||
| /** Destructor. */ | |||
| ~MemoryBlock() throw(); | |||
| @@ -68,7 +67,7 @@ public: | |||
| This block will be resized and copied to exactly match the other one. | |||
| */ | |||
| MemoryBlock& operator= (const MemoryBlock& other) throw(); | |||
| MemoryBlock& operator= (const MemoryBlock& other); | |||
| //============================================================================== | |||
| /** Compares two memory blocks. | |||
| @@ -120,7 +119,7 @@ public: | |||
| @see ensureSize | |||
| */ | |||
| void setSize (const size_t newSize, | |||
| const bool initialiseNewSpaceToZero = false) throw(); | |||
| bool initialiseNewSpaceToZero = false); | |||
| /** Increases the block's size only if it's smaller than a given size. | |||
| @@ -132,21 +131,20 @@ public: | |||
| @see setSize | |||
| */ | |||
| void ensureSize (const size_t minimumSize, | |||
| const bool initialiseNewSpaceToZero = false) throw(); | |||
| bool initialiseNewSpaceToZero = false); | |||
| //============================================================================== | |||
| /** Fills the entire memory block with a repeated byte value. | |||
| This is handy for clearing a block of memory to zero. | |||
| */ | |||
| void fillWith (const uint8 valueToUse) throw(); | |||
| void fillWith (uint8 valueToUse) throw(); | |||
| /** Adds another block of data to the end of this one. | |||
| This block's size will be increased accordingly. | |||
| */ | |||
| void append (const void* data, | |||
| const size_t numBytes) throw(); | |||
| void append (const void* data, size_t numBytes); | |||
| /** Exchanges the contents of this and another memory block. | |||
| No actual copying is required for this, so it's very fast. | |||
| @@ -183,12 +181,12 @@ public: | |||
| If the range specified goes beyond the size of the block, it will be clipped. | |||
| */ | |||
| void removeSection (size_t startByte, size_t numBytesToRemove) throw(); | |||
| void removeSection (size_t startByte, size_t numBytesToRemove); | |||
| //============================================================================== | |||
| /** Attempts to parse the contents of the block as a zero-terminated string of 8-bit | |||
| characters in the system's default encoding. */ | |||
| const String toString() const throw(); | |||
| const String toString() const; | |||
| //============================================================================== | |||
| /** Parses a string of hexadecimal numbers and writes this data into the memory block. | |||
| @@ -198,7 +196,7 @@ public: | |||
| @see String::toHexString() | |||
| */ | |||
| void loadFromHexString (const String& sourceHexString) throw(); | |||
| void loadFromHexString (const String& sourceHexString); | |||
| //============================================================================== | |||
| /** Sets a number of bits in the memory block, treating it as a long binary sequence. */ | |||
| @@ -218,7 +216,7 @@ public: | |||
| @see fromBase64Encoding | |||
| */ | |||
| const String toBase64Encoding() const throw(); | |||
| const String toBase64Encoding() const; | |||
| /** Takes a string of encoded characters and turns it into binary data. | |||
| @@ -227,7 +225,7 @@ public: | |||
| @see toBase64Encoding | |||
| */ | |||
| bool fromBase64Encoding (const String& encodedString) throw(); | |||
| bool fromBase64Encoding (const String& encodedString); | |||
| //============================================================================== | |||
| @@ -29,7 +29,6 @@ | |||
| #include "juce_ArrayAllocationBase.h" | |||
| #include "juce_ElementComparator.h" | |||
| #include "../threads/juce_CriticalSection.h" | |||
| #include "../containers/juce_ScopedPointer.h" | |||
| //============================================================================== | |||
| @@ -301,26 +300,33 @@ public: | |||
| { | |||
| if (indexToChange >= 0) | |||
| { | |||
| ScopedPointer <ObjectClass> toDelete; | |||
| const ScopedLockType lock (getLock()); | |||
| ObjectClass* toDelete = 0; | |||
| if (indexToChange < numUsed) | |||
| { | |||
| if (deleteOldElement) | |||
| const ScopedLockType lock (getLock()); | |||
| if (indexToChange < numUsed) | |||
| { | |||
| toDelete = data.elements [indexToChange]; | |||
| if (deleteOldElement) | |||
| { | |||
| toDelete = data.elements [indexToChange]; | |||
| if (toDelete == newObject) | |||
| toDelete = 0; | |||
| } | |||
| if (toDelete == newObject) | |||
| toDelete = 0; | |||
| } | |||
| data.elements [indexToChange] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| else | |||
| { | |||
| data.ensureAllocatedSize (numUsed + 1); | |||
| data.elements [numUsed++] = const_cast <ObjectClass*> (newObject); | |||
| data.elements [indexToChange] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| else | |||
| { | |||
| data.ensureAllocatedSize (numUsed + 1); | |||
| data.elements [numUsed++] = const_cast <ObjectClass*> (newObject); | |||
| } | |||
| } | |||
| delete toDelete; // don't want to use a ScopedPointer here because if the | |||
| // object has a private destructor, both OwnedArray and | |||
| // ScopedPointer would need to be friend classes.. | |||
| } | |||
| } | |||
| @@ -481,25 +487,32 @@ public: | |||
| void remove (const int indexToRemove, | |||
| const bool deleteObject = true) | |||
| { | |||
| ScopedPointer <ObjectClass> toDelete; | |||
| const ScopedLockType lock (getLock()); | |||
| ObjectClass* toDelete = 0; | |||
| if (((unsigned int) indexToRemove) < (unsigned int) numUsed) | |||
| { | |||
| ObjectClass** const e = data.elements + indexToRemove; | |||
| const ScopedLockType lock (getLock()); | |||
| if (deleteObject) | |||
| toDelete = *e; | |||
| if (((unsigned int) indexToRemove) < (unsigned int) numUsed) | |||
| { | |||
| ObjectClass** const e = data.elements + indexToRemove; | |||
| --numUsed; | |||
| const int numToShift = numUsed - indexToRemove; | |||
| if (deleteObject) | |||
| toDelete = *e; | |||
| if (numToShift > 0) | |||
| memmove (e, e + 1, numToShift * sizeof (ObjectClass*)); | |||
| --numUsed; | |||
| const int numToShift = numUsed - indexToRemove; | |||
| if ((numUsed << 1) < data.numAllocated) | |||
| minimiseStorageOverheads(); | |||
| if (numToShift > 0) | |||
| memmove (e, e + 1, numToShift * sizeof (ObjectClass*)); | |||
| } | |||
| } | |||
| delete toDelete; // don't want to use a ScopedPointer here because if the | |||
| // object has a private destructor, both OwnedArray and | |||
| // ScopedPointer would need to be friend classes.. | |||
| if ((numUsed << 1) < data.numAllocated) | |||
| minimiseStorageOverheads(); | |||
| } | |||
| /** Removes and returns an object from the array without deleting it. | |||
| @@ -33,6 +33,7 @@ | |||
| #include "../colour/juce_Colours.h" | |||
| #include "../colour/juce_ColourGradient.h" | |||
| #include "juce_RectanglePlacement.h" | |||
| #include "../../../containers/juce_ScopedPointer.h" | |||
| class LowLevelGraphicsContext; | |||
| class Image; | |||
| class FillType; | |||