Browse Source

Small tweaks for OwnedArray, and some minor clean-ups.

tags/2021-05-28
Julian Storer 14 years ago
parent
commit
4e68bd517b
7 changed files with 132 additions and 117 deletions
  1. +12
    -17
      juce_amalgamated.cpp
  2. +53
    -41
      juce_amalgamated.h
  3. +1
    -0
      src/audio/synthesisers/juce_Sampler.h
  4. +12
    -17
      src/containers/juce_MemoryBlock.cpp
  5. +13
    -15
      src/containers/juce_MemoryBlock.h
  6. +40
    -27
      src/containers/juce_OwnedArray.h
  7. +1
    -0
      src/gui/graphics/contexts/juce_Graphics.h

+ 12
- 17
juce_amalgamated.cpp View File

@@ -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) 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) : size (other.size)
{ {
if (size > 0) 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)) : size (jmax ((size_t) 0, sizeInBytes))
{ {
jassert (sizeInBytes >= 0); jassert (sizeInBytes >= 0);
@@ -3464,7 +3462,7 @@ MemoryBlock::~MemoryBlock() throw()
jassert (size == 0 || data != 0); // non-zero size but no data allocated? 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) 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 // 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) 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) if (size < minimumSize)
setSize (minimumSize, initialiseToZero); setSize (minimumSize, initialiseToZero);
@@ -3539,8 +3535,7 @@ void MemoryBlock::fillWith (const uint8 value) throw()
memset (data, (int) value, size); 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) 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); 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) 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); 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); ensureSize (hex.length() >> 1);
char* dest = data; char* dest = data;
@@ -3713,7 +3708,7 @@ void MemoryBlock::loadFromHexString (const String& hex) throw()


const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; 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; const size_t numChars = ((size << 3) + 5) / 6;


@@ -3733,7 +3728,7 @@ const String MemoryBlock::toBase64Encoding() const throw()
return destString; return destString;
} }


bool MemoryBlock::fromBase64Encoding (const String& s) throw()
bool MemoryBlock::fromBase64Encoding (const String& s)
{ {
const int startPos = s.indexOfChar ('.') + 1; const int startPos = s.indexOfChar ('.') + 1;




+ 53
- 41
juce_amalgamated.h View File

@@ -4869,18 +4869,17 @@ public:
@param initialiseToZero whether to clear the memory or just leave it uninitialised @param initialiseToZero whether to clear the memory or just leave it uninitialised
*/ */
MemoryBlock (const size_t initialSize, MemoryBlock (const size_t initialSize,
const bool initialiseToZero = false) throw();
bool initialiseToZero = false);


/** Creates a copy of another memory block. */ /** 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. /** Creates a memory block using a copy of a block of data.


@param dataToInitialiseFrom some data to copy into this block @param dataToInitialiseFrom some data to copy into this block
@param sizeInBytes how much space to use @param sizeInBytes how much space to use
*/ */
MemoryBlock (const void* dataToInitialiseFrom,
const size_t sizeInBytes) throw();
MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes);


/** Destructor. */ /** Destructor. */
~MemoryBlock() throw(); ~MemoryBlock() throw();
@@ -4889,7 +4888,7 @@ public:


This block will be resized and copied to exactly match the other one. 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. /** Compares two memory blocks.


@@ -4937,7 +4936,7 @@ public:
@see ensureSize @see ensureSize
*/ */
void setSize (const size_t newSize, 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. /** Increases the block's size only if it's smaller than a given size.


@@ -4949,20 +4948,19 @@ public:
@see setSize @see setSize
*/ */
void ensureSize (const size_t minimumSize, void ensureSize (const size_t minimumSize,
const bool initialiseNewSpaceToZero = false) throw();
bool initialiseNewSpaceToZero = false);


/** Fills the entire memory block with a repeated byte value. /** Fills the entire memory block with a repeated byte value.


This is handy for clearing a block of memory to zero. 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. /** Adds another block of data to the end of this one.


This block's size will be increased accordingly. 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. /** Exchanges the contents of this and another memory block.
No actual copying is required for this, so it's very fast. 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. 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 /** Attempts to parse the contents of the block as a zero-terminated string of 8-bit
characters in the system's default encoding. */ 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. /** Parses a string of hexadecimal numbers and writes this data into the memory block.


@@ -5011,7 +5009,7 @@ public:


@see String::toHexString() @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. */ /** Sets a number of bits in the memory block, treating it as a long binary sequence. */
void setBitRange (size_t bitRangeStart, void setBitRange (size_t bitRangeStart,
@@ -5029,7 +5027,7 @@ public:


@see fromBase64Encoding @see fromBase64Encoding
*/ */
const String toBase64Encoding() const throw();
const String toBase64Encoding() const;


/** Takes a string of encoded characters and turns it into binary data. /** Takes a string of encoded characters and turns it into binary data.


@@ -5038,7 +5036,7 @@ public:


@see toBase64Encoding @see toBase64Encoding
*/ */
bool fromBase64Encoding (const String& encodedString) throw();
bool fromBase64Encoding (const String& encodedString);


juce_UseDebuggingNewOperator juce_UseDebuggingNewOperator


@@ -7024,26 +7022,33 @@ public:
{ {
if (indexToChange >= 0) 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, void remove (const int indexToRemove,
const bool deleteObject = true) 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. /** Removes and returns an object from the array without deleting it.


+ 1
- 0
src/audio/synthesisers/juce_Sampler.h View File

@@ -27,6 +27,7 @@
#define __JUCE_SAMPLER_JUCEHEADER__ #define __JUCE_SAMPLER_JUCEHEADER__
#include "../../containers/juce_BigInteger.h" #include "../../containers/juce_BigInteger.h"
#include "../../containers/juce_ScopedPointer.h"
#include "juce_Synthesiser.h" #include "juce_Synthesiser.h"


+ 12
- 17
src/containers/juce_MemoryBlock.cpp View File

@@ -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) 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) : size (other.size)
{ {
if (size > 0) 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)) : size (jmax ((size_t) 0, sizeInBytes))
{ {
jassert (sizeInBytes >= 0); jassert (sizeInBytes >= 0);
@@ -84,7 +82,7 @@ MemoryBlock::~MemoryBlock() throw()
jassert (size == 0 || data != 0); // non-zero size but no data allocated? 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) 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 // 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) 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) if (size < minimumSize)
setSize (minimumSize, initialiseToZero); setSize (minimumSize, initialiseToZero);
@@ -162,8 +158,7 @@ void MemoryBlock::fillWith (const uint8 value) throw()
memset (data, (int) value, size); 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) 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); 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) 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); 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); ensureSize (hex.length() >> 1);
char* dest = data; char* dest = data;
@@ -339,7 +334,7 @@ void MemoryBlock::loadFromHexString (const String& hex) throw()
//============================================================================== //==============================================================================
const char* const MemoryBlock::encodingTable = ".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+"; 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; const size_t numChars = ((size << 3) + 5) / 6;
@@ -359,7 +354,7 @@ const String MemoryBlock::toBase64Encoding() const throw()
return destString; return destString;
} }
bool MemoryBlock::fromBase64Encoding (const String& s) throw()
bool MemoryBlock::fromBase64Encoding (const String& s)
{ {
const int startPos = s.indexOfChar ('.') + 1; const int startPos = s.indexOfChar ('.') + 1;


+ 13
- 15
src/containers/juce_MemoryBlock.h View File

@@ -48,18 +48,17 @@ public:
@param initialiseToZero whether to clear the memory or just leave it uninitialised @param initialiseToZero whether to clear the memory or just leave it uninitialised
*/ */
MemoryBlock (const size_t initialSize, MemoryBlock (const size_t initialSize,
const bool initialiseToZero = false) throw();
bool initialiseToZero = false);
/** Creates a copy of another memory block. */ /** 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. /** Creates a memory block using a copy of a block of data.
@param dataToInitialiseFrom some data to copy into this block @param dataToInitialiseFrom some data to copy into this block
@param sizeInBytes how much space to use @param sizeInBytes how much space to use
*/ */
MemoryBlock (const void* dataToInitialiseFrom,
const size_t sizeInBytes) throw();
MemoryBlock (const void* dataToInitialiseFrom, size_t sizeInBytes);
/** Destructor. */ /** Destructor. */
~MemoryBlock() throw(); ~MemoryBlock() throw();
@@ -68,7 +67,7 @@ public:
This block will be resized and copied to exactly match the other one. 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. /** Compares two memory blocks.
@@ -120,7 +119,7 @@ public:
@see ensureSize @see ensureSize
*/ */
void setSize (const size_t newSize, 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. /** Increases the block's size only if it's smaller than a given size.
@@ -132,21 +131,20 @@ public:
@see setSize @see setSize
*/ */
void ensureSize (const size_t minimumSize, void ensureSize (const size_t minimumSize,
const bool initialiseNewSpaceToZero = false) throw();
bool initialiseNewSpaceToZero = false);
//============================================================================== //==============================================================================
/** Fills the entire memory block with a repeated byte value. /** Fills the entire memory block with a repeated byte value.
This is handy for clearing a block of memory to zero. 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. /** Adds another block of data to the end of this one.
This block's size will be increased accordingly. 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. /** Exchanges the contents of this and another memory block.
No actual copying is required for this, so it's very fast. 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. 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 /** Attempts to parse the contents of the block as a zero-terminated string of 8-bit
characters in the system's default encoding. */ 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. /** Parses a string of hexadecimal numbers and writes this data into the memory block.
@@ -198,7 +196,7 @@ public:
@see String::toHexString() @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. */ /** Sets a number of bits in the memory block, treating it as a long binary sequence. */
@@ -218,7 +216,7 @@ public:
@see fromBase64Encoding @see fromBase64Encoding
*/ */
const String toBase64Encoding() const throw();
const String toBase64Encoding() const;
/** Takes a string of encoded characters and turns it into binary data. /** Takes a string of encoded characters and turns it into binary data.
@@ -227,7 +225,7 @@ public:
@see toBase64Encoding @see toBase64Encoding
*/ */
bool fromBase64Encoding (const String& encodedString) throw();
bool fromBase64Encoding (const String& encodedString);
//============================================================================== //==============================================================================


+ 40
- 27
src/containers/juce_OwnedArray.h View File

@@ -29,7 +29,6 @@
#include "juce_ArrayAllocationBase.h" #include "juce_ArrayAllocationBase.h"
#include "juce_ElementComparator.h" #include "juce_ElementComparator.h"
#include "../threads/juce_CriticalSection.h" #include "../threads/juce_CriticalSection.h"
#include "../containers/juce_ScopedPointer.h"
//============================================================================== //==============================================================================
@@ -301,26 +300,33 @@ public:
{ {
if (indexToChange >= 0) 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, void remove (const int indexToRemove,
const bool deleteObject = true) 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. /** Removes and returns an object from the array without deleting it.


+ 1
- 0
src/gui/graphics/contexts/juce_Graphics.h View File

@@ -33,6 +33,7 @@
#include "../colour/juce_Colours.h" #include "../colour/juce_Colours.h"
#include "../colour/juce_ColourGradient.h" #include "../colour/juce_ColourGradient.h"
#include "juce_RectanglePlacement.h" #include "juce_RectanglePlacement.h"
#include "../../../containers/juce_ScopedPointer.h"
class LowLevelGraphicsContext; class LowLevelGraphicsContext;
class Image; class Image;
class FillType; class FillType;


Loading…
Cancel
Save