Browse Source

Changed SparseSet to work with Range objects. Fixed array sorting bug.

tags/2021-05-28
Julian Storer 15 years ago
parent
commit
9c5651fb8e
14 changed files with 251 additions and 310 deletions
  1. +47
    -46
      juce_amalgamated.cpp
  2. +73
    -100
      juce_amalgamated.h
  3. +1
    -1
      src/containers/juce_ElementComparator.h
  4. +4
    -4
      src/containers/juce_Range.h
  5. +71
    -113
      src/containers/juce_SparseSet.h
  6. +8
    -8
      src/gui/components/controls/juce_ListBox.cpp
  7. +1
    -1
      src/gui/components/controls/juce_TableListBox.cpp
  8. +5
    -7
      src/gui/graphics/imaging/juce_Image.cpp
  9. +7
    -7
      src/native/windows/juce_win32_CameraDevice.cpp
  10. +1
    -1
      src/native/windows/juce_win32_Files.cpp
  11. +19
    -20
      src/native/windows/juce_win32_NativeIncludes.h
  12. +2
    -2
      src/native/windows/juce_win32_WASAPI.cpp
  13. +6
    -0
      src/text/juce_StringArray.cpp
  14. +6
    -0
      src/text/juce_StringArray.h

+ 47
- 46
juce_amalgamated.cpp View File

@@ -435,45 +435,42 @@
#pragma warning (pop)
#endif

template <class T>
template <class ComClass>
class ComSmartPtr
{
public:
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (T* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<T>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (ComClass* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<ComClass>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }

operator T*() const throw() { return p; }
T& operator*() const throw() { return *p; }
T** operator&() throw() { return &p; }
T* operator->() const throw() { return p; }
operator ComClass*() const throw() { return p; }
ComClass& operator*() const throw() { return *p; }
ComClass** operator&() throw() { return &p; }
ComClass* operator->() const throw() { return p; }

T* operator= (T* const newP)
ComClass* operator= (ComClass* const newP)
{
if (newP != 0)
newP->AddRef();

if (p != 0)
p->Release();

if (newP != 0) newP->AddRef();
if (p != 0) p->Release();
p = newP;
return newP;
}

T* operator= (const ComSmartPtr<T>& newP) { return operator= (newP.p); }
ComClass* operator= (const ComSmartPtr<ComClass>& newP) { return operator= (newP.p); }

HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext)
HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
{
#ifndef __MINGW32__
operator= (0);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof(T), (void**) &p);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof (ComClass), (void**) &p);
#else
return S_FALSE;
#endif
}

T* p;
private:
ComClass* p;
};

template <class ComClass>
@@ -12155,6 +12152,12 @@ const String& StringArray::operator[] (const int index) const throw()
return String::empty;
}

String& StringArray::getReference (const int index) throw()
{
jassert (((unsigned int) index) < (unsigned int) strings.size());
return strings.getReference (index);
}

void StringArray::add (const String& newString)
{
strings.add (newString);
@@ -46807,7 +46810,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());

if (selectedRows.size() > 0)
{
@@ -47097,7 +47100,7 @@ void ListBox::updateContent()

if (selected [selected.size() - 1] >= totalItems)
{
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));
lastRowSelected = getSelectedRow (0);
selectionChanged = true;
}
@@ -47132,7 +47135,7 @@ void ListBox::selectRowInternal (const int row,
if (deselectOthersFirst)
selected.clear();

selected.addRange (row, 1);
selected.addRange (Range<int> (row, row + 1));

if (getHeight() == 0 || getWidth() == 0)
dontScroll = true;
@@ -47181,7 +47184,7 @@ void ListBox::deselectRow (const int row)
{
if (selected.contains (row))
{
selected.removeRange (row, 1);
selected.removeRange (Range <int> (row, row + 1));

if (row == lastRowSelected)
lastRowSelected = getSelectedRow (0);
@@ -47195,7 +47198,7 @@ void ListBox::setSelectedRows (const SparseSet<int>& setOfRowsToBeSelected,
const bool sendNotificationEventToModel)
{
selected = setOfRowsToBeSelected;
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));

if (! isRowSelected (lastRowSelected))
lastRowSelected = getSelectedRow (0);
@@ -47219,10 +47222,10 @@ void ListBox::selectRangeOfRows (int firstRow, int lastRow)
firstRow = jlimit (0, jmax (0, numRows), firstRow);
lastRow = jlimit (0, jmax (0, numRows), lastRow);

selected.addRange (jmin (firstRow, lastRow),
abs (firstRow - lastRow) + 1);
selected.addRange (Range <int> (jmin (firstRow, lastRow),
jmax (firstRow, lastRow) + 1));

selected.removeRange (lastRow, 1);
selected.removeRange (Range <int> (lastRow, lastRow + 1));
}

selectRowInternal (lastRow, false, false, true);
@@ -50202,7 +50205,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());

if (selectedRows.size() > 0)
{
@@ -90835,7 +90838,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
if (hasAlphaChannel())
{
const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));
SparseSet <int> pixelsOnRow;
SparseSet<int> pixelsOnRow;

const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());

@@ -90849,7 +90852,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (((const PixelARGB*) lineData)->getAlpha() >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));

lineData += srcData.pixelStride;
}
@@ -90859,7 +90862,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (*lineData >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));

lineData += srcData.pixelStride;
}
@@ -90867,10 +90870,8 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho

for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)
{
int x, w;

if (pixelsOnRow.getRange (i, x, w))
result.add (Rectangle<int> (x, y, w, 1));
const Range<int> range (pixelsOnRow.getRange (i));
result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));
}

result.consolidate();
@@ -212224,7 +212225,7 @@ const File File::getLinkedTarget() const
return result;

ComSmartPtr <IShellLink> shellLink;
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink, CLSCTX_INPROC_SERVER)))
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)))
{
ComSmartPtr <IPersistFile> persistFile;
if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile)))
@@ -226110,7 +226111,7 @@ private:
bool createDevices()
{
ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return false;

ComSmartPtr <IMMDeviceCollection> deviceCollection;
@@ -226170,7 +226171,7 @@ public:
inputDeviceIds.clear();

ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return;

const String defaultRenderer = getDefaultEndpoint (enumerator, false);
@@ -226352,7 +226353,7 @@ public:
activeImage (0),
loadingImage (0)
{
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph, CLSCTX_INPROC);
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);
if (FAILED (hr))
return;

@@ -226383,7 +226384,7 @@ public:
if (FAILED (hr))
return;

hr = smartTee.CoCreateInstance (CLSID_SmartTee, CLSCTX_INPROC_SERVER);
hr = smartTee.CoCreateInstance (CLSID_SmartTee);
if (FAILED (hr))
return;

@@ -226395,7 +226396,7 @@ public:
return;

ComSmartPtr <IBaseFilter> sampleGrabberBase;
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber, CLSCTX_INPROC_SERVER);
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber);
if (FAILED (hr))
return;

@@ -226434,7 +226435,7 @@ public:
height = pVih->bmiHeader.biHeight;

ComSmartPtr <IBaseFilter> nullFilter;
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer, CLSCTX_INPROC_SERVER);
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer);
hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer"));

if (connectFilters (sampleGrabberBase, nullFilter)
@@ -226562,7 +226563,7 @@ public:
firstRecordedTime = Time();
recordNextFrameTime = true;

HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter, CLSCTX_INPROC_SERVER);
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter);

if (SUCCEEDED (hr))
{
@@ -227029,7 +227030,7 @@ static ComSmartPtr <IBaseFilter> enumerateCameras (StringArray* const names,
ComSmartPtr <IBaseFilter> result;

ComSmartPtr <ICreateDevEnum> pDevEnum;
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum, CLSCTX_INPROC);
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum);

if (SUCCEEDED (hr))
{
@@ -227100,7 +227101,7 @@ CameraDevice* CameraDevice::openDevice (int index,
int maxWidth, int maxHeight)
{
ComSmartPtr <ICaptureGraphBuilder2> captureGraphBuilder;
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2, CLSCTX_INPROC);
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);

if (SUCCEEDED (hr))
{


+ 73
- 100
juce_amalgamated.h View File

@@ -1868,7 +1868,7 @@ private:
public:
static int compareElements (ParameterType first, ParameterType second)
{
return (first < second) ? -1 : ((first < second) ? 1 : 0);
return (first < second) ? -1 : ((second < first) ? 1 : 0);
}
};

@@ -3997,6 +3997,8 @@ public:

const String& operator[] (int index) const throw();

String& getReference (int index) throw();

bool contains (const String& stringToLookFor,
bool ignoreCase = false) const;

@@ -4886,7 +4888,7 @@ public:
void setStart (const ValueType newStart) throw()
{
start = newStart;
if (newStart > end)
if (end < newStart)
end = newStart;
}

@@ -4956,7 +4958,7 @@ public:

bool contains (const ValueType position) const throw()
{
return position >= start && position < end;
return start <= position && position < end;
}

ValueType clipValue (const ValueType value) const throw()
@@ -4966,7 +4968,7 @@ public:

bool intersects (const Range& other) const throw()
{
return other.start < end && other.end > start;
return other.start < end && start < other.end;
}

const Range getIntersectionWith (const Range& other) const throw()
@@ -4984,7 +4986,7 @@ public:
const Range constrainRange (const Range& rangeToConstrain) const throw()
{
const ValueType otherLen = rangeToConstrain.getLength();
return otherLen >= getLength()
return getLength() <= otherLen
? *this
: rangeToConstrain.movedToStartAt (jlimit (start, end - otherLen, rangeToConstrain.getStart()));
}
@@ -5802,20 +5804,20 @@ class SparseSet
{
public:

SparseSet() throw()
SparseSet()
{
}

SparseSet (const SparseSet<Type>& other) throw()
SparseSet (const SparseSet<Type>& other)
: values (other.values)
{
}

~SparseSet() throw()
~SparseSet()
{
}

void clear() throw()
void clear()
{
values.clear();
}
@@ -5825,43 +5827,37 @@ public:
return values.size() == 0;
}

Type size() const throw()
Type size() const
{
Type num = 0;
Type total (0);

for (int i = 0; i < values.size(); i += 2)
num += values[i + 1] - values[i];
total += values.getUnchecked (i + 1) - values.getUnchecked (i);

return num;
return total;
}

Type operator[] (int index) const throw()
Type operator[] (Type index) const
{
for (int i = 0; i < values.size(); i += 2)
{
const Type s = values.getUnchecked(i);
const Type e = values.getUnchecked(i + 1);
const Type start (values.getUnchecked (i));
const Type len (values.getUnchecked (i + 1) - start);

if (index < e - s)
return s + index;
if (index < len)
return start + index;

index -= e - s;
index -= len;
}

return (Type) 0;
return Type (0);
}

bool contains (const Type valueToLookFor) const throw()
bool contains (const Type valueToLookFor) const
{
bool on = false;

for (int i = 0; i < values.size(); ++i)
{
if (values.getUnchecked(i) > valueToLookFor)
return on;

on = ! on;
}
if (valueToLookFor < values.getUnchecked(i))
return (i & 1) != 0;

return false;
}
@@ -5871,67 +5867,64 @@ public:
return values.size() >> 1;
}

bool getRange (const int rangeIndex,
Type& startValue,
Type& numValues) const throw()
const Range<Type> getRange (const int rangeIndex) const
{
if (((unsigned int) rangeIndex) < (unsigned int) getNumRanges())
{
startValue = values [rangeIndex << 1];
numValues = values [(rangeIndex << 1) + 1] - startValue;

return true;
}

return false;
return Range<Type> (values.getUnchecked (rangeIndex << 1),
values.getUnchecked ((rangeIndex << 1) + 1));
else
return Range<Type>();
}

bool getTotalRange (Type& lowestValue,
Type& highestValue) const throw()
const Range<Type> getTotalRange() const
{
if (values.size() > 0)
{
lowestValue = values.getUnchecked (0);
highestValue = values.getUnchecked (values.size() - 1);
return true;
jassert ((values.size() & 1) == 0);
return Range<Type> (values.getUnchecked (0),
values.getUnchecked (values.size() - 1));
}

return false;
return Range<Type>();
}

void addRange (const Type firstValue,
const Type numValuesToAdd) throw()
void addRange (const Range<Type>& range)
{
jassert (numValuesToAdd >= 0);

if (numValuesToAdd > 0)
jassert (range.getLength() >= 0);
if (range.getLength() > 0)
{
removeRange (firstValue, numValuesToAdd);
removeRange (range);

values.addUsingDefaultSort (firstValue);
values.addUsingDefaultSort (firstValue + numValuesToAdd);
values.addUsingDefaultSort (range.getStart());
values.addUsingDefaultSort (range.getEnd());

simplify();
}

String s;
for (int i = 0; i < values.size(); ++i)
s << values[i] << " ";
DBG (s);
}

void removeRange (const Type firstValue,
const Type numValuesToRemove) throw()
void removeRange (const Range<Type>& rangeToRemove)
{
jassert (numValuesToRemove >= 0);
jassert (rangeToRemove.getLength() >= 0);

if (numValuesToRemove >= 0
&& firstValue < values.getLast())
if (rangeToRemove.getLength() > 0
&& values.size() > 0
&& rangeToRemove.getStart() < values.getUnchecked (values.size() - 1)
&& values.getUnchecked(0) < rangeToRemove.getEnd())
{
const bool onAtStart = contains (firstValue - 1);
const Type lastValue = firstValue + jmin (numValuesToRemove, values.getLast() - firstValue);
const bool onAtStart = contains (rangeToRemove.getStart() - 1);
const Type lastValue (jmin (rangeToRemove.getEnd(), values.getLast()));
const bool onAtEnd = contains (lastValue);

for (int i = values.size(); --i >= 0;)
{
if (values.getUnchecked(i) <= lastValue)
{
while (values.getUnchecked(i) >= firstValue)
while (values.getUnchecked(i) >= rangeToRemove.getStart())
{
values.remove (i);

@@ -5943,55 +5936,38 @@ public:
}
}

if (onAtStart)
values.addUsingDefaultSort (firstValue);

if (onAtEnd)
values.addUsingDefaultSort (lastValue);
if (onAtStart) values.addUsingDefaultSort (rangeToRemove.getStart());
if (onAtEnd) values.addUsingDefaultSort (lastValue);

simplify();
}
}

void invertRange (const Type firstValue,
const Type numValues)
void invertRange (const Range<Type>& range)
{
SparseSet newItems;
newItems.addRange (firstValue, numValues);
newItems.addRange (range);

int i;
for (i = getNumRanges(); --i >= 0;)
{
const int start = values [i << 1];
const int end = values [(i << 1) + 1];
newItems.removeRange (getRange (i));

newItems.removeRange (start, end);
}

removeRange (firstValue, numValues);
removeRange (range);

for (i = newItems.getNumRanges(); --i >= 0;)
{
const int start = newItems.values [i << 1];
const int end = newItems.values [(i << 1) + 1];

addRange (start, end);
}
addRange (newItems.getRange(i));
}

bool overlapsRange (const Type firstValue,
const Type numValues) throw()
bool overlapsRange (const Range<Type>& range)
{
jassert (numValues >= 0);

if (numValues > 0)
if (range.getLength() > 0)
{
for (int i = getNumRanges(); --i >= 0;)
{
if (firstValue >= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked ((i << 1) + 1) <= range.getStart())
return false;

if (firstValue + numValues > values.getUnchecked (i << 1))
if (values.getUnchecked (i << 1) < range.getEnd())
return true;
}
}
@@ -5999,20 +5975,17 @@ public:
return false;
}

bool containsRange (const Type firstValue,
const Type numValues) throw()
bool containsRange (const Range<Type>& range)
{
jassert (numValues >= 0);

if (numValues > 0)
if (range.getLength() > 0)
{
for (int i = getNumRanges(); --i >= 0;)
{
if (firstValue >= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked ((i << 1) + 1) <= range.getStart())
return false;

if (firstValue >= values.getUnchecked (i << 1)
&& firstValue + numValues <= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked (i << 1) <= range.getStart()
&& range.getEnd() <= values.getUnchecked ((i << 1) + 1))
return true;
}
}
@@ -6036,13 +6009,13 @@ private:
// alternating start/end values of ranges of values that are present.
Array<Type, DummyCriticalSection> values;

void simplify() throw()
void simplify()
{
jassert ((values.size() & 1) == 0);

for (int i = values.size(); --i > 0;)
if (values.getUnchecked(i) == values.getUnchecked (i - 1))
values.removeRange (i - 1, 2);
values.removeRange (--i, 2);
}
};



+ 1
- 1
src/containers/juce_ElementComparator.h View File

@@ -279,7 +279,7 @@ private:
public:
static int compareElements (ParameterType first, ParameterType second)
{
return (first < second) ? -1 : ((first < second) ? 1 : 0);
return (first < second) ? -1 : ((second < first) ? 1 : 0);
}
};


+ 4
- 4
src/containers/juce_Range.h View File

@@ -104,7 +104,7 @@ public:
void setStart (const ValueType newStart) throw()
{
start = newStart;
if (newStart > end)
if (end < newStart)
end = newStart;
}
@@ -204,7 +204,7 @@ public:
/** Returns true if the given position lies inside this range. */
bool contains (const ValueType position) const throw()
{
return position >= start && position < end;
return start <= position && position < end;
}
/** Returns the nearest value to the one supplied, which lies within the range. */
@@ -216,7 +216,7 @@ public:
/** Returns true if the given range intersects this one. */
bool intersects (const Range& other) const throw()
{
return other.start < end && other.end > start;
return other.start < end && start < other.end;
}
/** Returns the range that is the intersection of the two ranges, or an empty range
@@ -247,7 +247,7 @@ public:
const Range constrainRange (const Range& rangeToConstrain) const throw()
{
const ValueType otherLen = rangeToConstrain.getLength();
return otherLen >= getLength()
return getLength() <= otherLen
? *this
: rangeToConstrain.movedToStartAt (jlimit (start, end - otherLen, rangeToConstrain.getStart()));
}


+ 71
- 113
src/containers/juce_SparseSet.h View File

@@ -27,6 +27,7 @@
#define __JUCE_SPARSESET_JUCEHEADER__
#include "juce_ArrayAllocationBase.h"
#include "juce_Range.h"
#include "../threads/juce_CriticalSection.h"
@@ -47,24 +48,24 @@ class SparseSet
public:
//==============================================================================
/** Creates a new empty set. */
SparseSet() throw()
SparseSet()
{
}
/** Creates a copy of another SparseSet. */
SparseSet (const SparseSet<Type>& other) throw()
SparseSet (const SparseSet<Type>& other)
: values (other.values)
{
}
/** Destructor. */
~SparseSet() throw()
~SparseSet()
{
}
//==============================================================================
/** Clears the set. */
void clear() throw()
void clear()
{
values.clear();
}
@@ -84,14 +85,14 @@ public:
are a lot of items in the set. Use isEmpty() for a quick test of whether there
are any items.
*/
Type size() const throw()
Type size() const
{
Type num = 0;
Type total (0);
for (int i = 0; i < values.size(); i += 2)
num += values[i + 1] - values[i];
total += values.getUnchecked (i + 1) - values.getUnchecked (i);
return num;
return total;
}
/** Returns one of the values in the set.
@@ -99,41 +100,34 @@ public:
@param index the index of the value to retrieve, in the range 0 to (size() - 1).
@returns the value at this index, or 0 if it's out-of-range
*/
Type operator[] (int index) const throw()
Type operator[] (Type index) const
{
for (int i = 0; i < values.size(); i += 2)
{
const Type s = values.getUnchecked(i);
const Type e = values.getUnchecked(i + 1);
const Type start (values.getUnchecked (i));
const Type len (values.getUnchecked (i + 1) - start);
if (index < e - s)
return s + index;
if (index < len)
return start + index;
index -= e - s;
index -= len;
}
return (Type) 0;
return Type (0);
}
/** Checks whether a particular value is in the set. */
bool contains (const Type valueToLookFor) const throw()
bool contains (const Type valueToLookFor) const
{
bool on = false;
for (int i = 0; i < values.size(); ++i)
{
if (values.getUnchecked(i) > valueToLookFor)
return on;
on = ! on;
}
if (valueToLookFor < values.getUnchecked(i))
return (i & 1) != 0;
return false;
}
//==============================================================================
/** Returns the number of contiguous blocks of values.
@see getRange
*/
int getNumRanges() const throw()
@@ -142,94 +136,78 @@ public:
}
/** Returns one of the contiguous ranges of values stored.
@param rangeIndex the index of the range to look up, between 0
and (getNumRanges() - 1)
@param startValue on return, the value at the start of the range
@param numValues on return, the number of values in the range
@see getTotalRange
*/
bool getRange (const int rangeIndex,
Type& startValue,
Type& numValues) const throw()
const Range<Type> getRange (const int rangeIndex) const
{
if (((unsigned int) rangeIndex) < (unsigned int) getNumRanges())
{
startValue = values [rangeIndex << 1];
numValues = values [(rangeIndex << 1) + 1] - startValue;
return true;
}
return false;
return Range<Type> (values.getUnchecked (rangeIndex << 1),
values.getUnchecked ((rangeIndex << 1) + 1));
else
return Range<Type>();
}
/** Returns the lowest and highest values in the set.
/** Returns the range between the lowest and highest values in the set.
@see getRange
*/
bool getTotalRange (Type& lowestValue,
Type& highestValue) const throw()
const Range<Type> getTotalRange() const
{
if (values.size() > 0)
{
lowestValue = values.getUnchecked (0);
highestValue = values.getUnchecked (values.size() - 1);
return true;
jassert ((values.size() & 1) == 0);
return Range<Type> (values.getUnchecked (0),
values.getUnchecked (values.size() - 1));
}
return false;
return Range<Type>();
}
//==============================================================================
/** Adds a range of contiguous values to the set.
e.g. addRange (10, 4) will add (10, 11, 12, 13) to the set.
@param firstValue the start of the range of values to add
@param numValuesToAdd how many values to add
e.g. addRange (Range \<int\> (10, 14)) will add (10, 11, 12, 13) to the set.
*/
void addRange (const Type firstValue,
const Type numValuesToAdd) throw()
void addRange (const Range<Type>& range)
{
jassert (numValuesToAdd >= 0);
if (numValuesToAdd > 0)
jassert (range.getLength() >= 0);
if (range.getLength() > 0)
{
removeRange (firstValue, numValuesToAdd);
removeRange (range);
values.addUsingDefaultSort (firstValue);
values.addUsingDefaultSort (firstValue + numValuesToAdd);
values.addUsingDefaultSort (range.getStart());
values.addUsingDefaultSort (range.getEnd());
simplify();
}
String s;
for (int i = 0; i < values.size(); ++i)
s << values[i] << " ";
DBG (s);
}
/** Removes a range of values from the set.
e.g. removeRange (10, 4) will remove (10, 11, 12, 13) from the set.
@param firstValue the start of the range of values to remove
@param numValuesToRemove how many values to remove
e.g. removeRange (Range\<int\> (10, 14)) will remove (10, 11, 12, 13) from the set.
*/
void removeRange (const Type firstValue,
const Type numValuesToRemove) throw()
void removeRange (const Range<Type>& rangeToRemove)
{
jassert (numValuesToRemove >= 0);
jassert (rangeToRemove.getLength() >= 0);
if (numValuesToRemove >= 0
&& firstValue < values.getLast())
if (rangeToRemove.getLength() > 0
&& values.size() > 0
&& rangeToRemove.getStart() < values.getUnchecked (values.size() - 1)
&& values.getUnchecked(0) < rangeToRemove.getEnd())
{
const bool onAtStart = contains (firstValue - 1);
const Type lastValue = firstValue + jmin (numValuesToRemove, values.getLast() - firstValue);
const bool onAtStart = contains (rangeToRemove.getStart() - 1);
const Type lastValue (jmin (rangeToRemove.getEnd(), values.getLast()));
const bool onAtEnd = contains (lastValue);
for (int i = values.size(); --i >= 0;)
{
if (values.getUnchecked(i) <= lastValue)
{
while (values.getUnchecked(i) >= firstValue)
while (values.getUnchecked(i) >= rangeToRemove.getStart())
{
values.remove (i);
@@ -241,57 +219,40 @@ public:
}
}
if (onAtStart)
values.addUsingDefaultSort (firstValue);
if (onAtEnd)
values.addUsingDefaultSort (lastValue);
if (onAtStart) values.addUsingDefaultSort (rangeToRemove.getStart());
if (onAtEnd) values.addUsingDefaultSort (lastValue);
simplify();
}
}
/** Does an XOR of the values in a given range. */
void invertRange (const Type firstValue,
const Type numValues)
void invertRange (const Range<Type>& range)
{
SparseSet newItems;
newItems.addRange (firstValue, numValues);
newItems.addRange (range);
int i;
for (i = getNumRanges(); --i >= 0;)
{
const int start = values [i << 1];
const int end = values [(i << 1) + 1];
newItems.removeRange (getRange (i));
newItems.removeRange (start, end);
}
removeRange (firstValue, numValues);
removeRange (range);
for (i = newItems.getNumRanges(); --i >= 0;)
{
const int start = newItems.values [i << 1];
const int end = newItems.values [(i << 1) + 1];
addRange (start, end);
}
addRange (newItems.getRange(i));
}
/** Checks whether any part of a given range overlaps any part of this one. */
bool overlapsRange (const Type firstValue,
const Type numValues) throw()
/** Checks whether any part of a given range overlaps any part of this set. */
bool overlapsRange (const Range<Type>& range)
{
jassert (numValues >= 0);
if (numValues > 0)
if (range.getLength() > 0)
{
for (int i = getNumRanges(); --i >= 0;)
{
if (firstValue >= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked ((i << 1) + 1) <= range.getStart())
return false;
if (firstValue + numValues > values.getUnchecked (i << 1))
if (values.getUnchecked (i << 1) < range.getEnd())
return true;
}
}
@@ -300,20 +261,17 @@ public:
}
/** Checks whether the whole of a given range is contained within this one. */
bool containsRange (const Type firstValue,
const Type numValues) throw()
bool containsRange (const Range<Type>& range)
{
jassert (numValues >= 0);
if (numValues > 0)
if (range.getLength() > 0)
{
for (int i = getNumRanges(); --i >= 0;)
{
if (firstValue >= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked ((i << 1) + 1) <= range.getStart())
return false;
if (firstValue >= values.getUnchecked (i << 1)
&& firstValue + numValues <= values.getUnchecked ((i << 1) + 1))
if (values.getUnchecked (i << 1) <= range.getStart()
&& range.getEnd() <= values.getUnchecked ((i << 1) + 1))
return true;
}
}
@@ -339,13 +297,13 @@ private:
// alternating start/end values of ranges of values that are present.
Array<Type, DummyCriticalSection> values;
void simplify() throw()
void simplify()
{
jassert ((values.size() & 1) == 0);
for (int i = values.size(); --i > 0;)
if (values.getUnchecked(i) == values.getUnchecked (i - 1))
values.removeRange (i - 1, 2);
values.removeRange (--i, 2);
}
};


+ 8
- 8
src/gui/components/controls/juce_ListBox.cpp View File

@@ -128,7 +128,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());
if (selectedRows.size() > 0)
{
@@ -426,7 +426,7 @@ void ListBox::updateContent()
if (selected [selected.size() - 1] >= totalItems)
{
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));
lastRowSelected = getSelectedRow (0);
selectionChanged = true;
}
@@ -462,7 +462,7 @@ void ListBox::selectRowInternal (const int row,
if (deselectOthersFirst)
selected.clear();
selected.addRange (row, 1);
selected.addRange (Range<int> (row, row + 1));
if (getHeight() == 0 || getWidth() == 0)
dontScroll = true;
@@ -511,7 +511,7 @@ void ListBox::deselectRow (const int row)
{
if (selected.contains (row))
{
selected.removeRange (row, 1);
selected.removeRange (Range <int> (row, row + 1));
if (row == lastRowSelected)
lastRowSelected = getSelectedRow (0);
@@ -525,7 +525,7 @@ void ListBox::setSelectedRows (const SparseSet<int>& setOfRowsToBeSelected,
const bool sendNotificationEventToModel)
{
selected = setOfRowsToBeSelected;
selected.removeRange (totalItems, std::numeric_limits<int>::max() - totalItems);
selected.removeRange (Range <int> (totalItems, std::numeric_limits<int>::max()));
if (! isRowSelected (lastRowSelected))
lastRowSelected = getSelectedRow (0);
@@ -549,10 +549,10 @@ void ListBox::selectRangeOfRows (int firstRow, int lastRow)
firstRow = jlimit (0, jmax (0, numRows), firstRow);
lastRow = jlimit (0, jmax (0, numRows), lastRow);
selected.addRange (jmin (firstRow, lastRow),
abs (firstRow - lastRow) + 1);
selected.addRange (Range <int> (jmin (firstRow, lastRow),
jmax (firstRow, lastRow) + 1));
selected.removeRange (lastRow, 1);
selected.removeRange (Range <int> (lastRow, lastRow + 1));
}
selectRowInternal (lastRow, false, false, true);


+ 1
- 1
src/gui/components/controls/juce_TableListBox.cpp View File

@@ -191,7 +191,7 @@ public:
{
if (isEnabled() && owner.getModel() != 0 && ! (e.mouseWasClicked() || isDragging))
{
const SparseSet <int> selectedRows (owner.getSelectedRows());
const SparseSet<int> selectedRows (owner.getSelectedRows());
if (selectedRows.size() > 0)
{


+ 5
- 7
src/gui/graphics/imaging/juce_Image.cpp View File

@@ -372,7 +372,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
if (hasAlphaChannel())
{
const uint8 threshold = (uint8) jlimit (0, 255, roundToInt (alphaThreshold * 255.0f));
SparseSet <int> pixelsOnRow;
SparseSet<int> pixelsOnRow;
const BitmapData srcData (*this, 0, 0, getWidth(), getHeight());
@@ -386,7 +386,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (((const PixelARGB*) lineData)->getAlpha() >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));
lineData += srcData.pixelStride;
}
@@ -396,7 +396,7 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int x = 0; x < imageWidth; ++x)
{
if (*lineData >= threshold)
pixelsOnRow.addRange (x, 1);
pixelsOnRow.addRange (Range<int> (x, x + 1));
lineData += srcData.pixelStride;
}
@@ -404,10 +404,8 @@ void Image::createSolidAreaMask (RectangleList& result, const float alphaThresho
for (int i = 0; i < pixelsOnRow.getNumRanges(); ++i)
{
int x, w;
if (pixelsOnRow.getRange (i, x, w))
result.add (Rectangle<int> (x, y, w, 1));
const Range<int> range (pixelsOnRow.getRange (i));
result.add (Rectangle<int> (range.getStart(), y, range.getLength(), 1));
}
result.consolidate();


+ 7
- 7
src/native/windows/juce_win32_CameraDevice.cpp View File

@@ -49,7 +49,7 @@ public:
activeImage (0),
loadingImage (0)
{
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph, CLSCTX_INPROC);
HRESULT hr = graphBuilder.CoCreateInstance (CLSID_FilterGraph);
if (FAILED (hr))
return;
@@ -80,7 +80,7 @@ public:
if (FAILED (hr))
return;
hr = smartTee.CoCreateInstance (CLSID_SmartTee, CLSCTX_INPROC_SERVER);
hr = smartTee.CoCreateInstance (CLSID_SmartTee);
if (FAILED (hr))
return;
@@ -92,7 +92,7 @@ public:
return;
ComSmartPtr <IBaseFilter> sampleGrabberBase;
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber, CLSCTX_INPROC_SERVER);
hr = sampleGrabberBase.CoCreateInstance (CLSID_SampleGrabber);
if (FAILED (hr))
return;
@@ -131,7 +131,7 @@ public:
height = pVih->bmiHeader.biHeight;
ComSmartPtr <IBaseFilter> nullFilter;
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer, CLSCTX_INPROC_SERVER);
hr = nullFilter.CoCreateInstance (CLSID_NullRenderer);
hr = graphBuilder->AddFilter (nullFilter, _T("Null Renderer"));
if (connectFilters (sampleGrabberBase, nullFilter)
@@ -259,7 +259,7 @@ public:
firstRecordedTime = Time();
recordNextFrameTime = true;
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter, CLSCTX_INPROC_SERVER);
HRESULT hr = asfWriter.CoCreateInstance (CLSID_WMAsfWriter);
if (SUCCEEDED (hr))
{
@@ -737,7 +737,7 @@ static ComSmartPtr <IBaseFilter> enumerateCameras (StringArray* const names,
ComSmartPtr <IBaseFilter> result;
ComSmartPtr <ICreateDevEnum> pDevEnum;
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum, CLSCTX_INPROC);
HRESULT hr = pDevEnum.CoCreateInstance (CLSID_SystemDeviceEnum);
if (SUCCEEDED (hr))
{
@@ -808,7 +808,7 @@ CameraDevice* CameraDevice::openDevice (int index,
int maxWidth, int maxHeight)
{
ComSmartPtr <ICaptureGraphBuilder2> captureGraphBuilder;
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2, CLSCTX_INPROC);
HRESULT hr = captureGraphBuilder.CoCreateInstance (CLSID_CaptureGraphBuilder2);
if (SUCCEEDED (hr))
{


+ 1
- 1
src/native/windows/juce_win32_Files.cpp View File

@@ -502,7 +502,7 @@ const File File::getLinkedTarget() const
return result;
ComSmartPtr <IShellLink> shellLink;
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink, CLSCTX_INPROC_SERVER)))
if (SUCCEEDED (shellLink.CoCreateInstance (CLSID_ShellLink)))
{
ComSmartPtr <IPersistFile> persistFile;
if (SUCCEEDED (shellLink->QueryInterface (IID_IPersistFile, (LPVOID*) &persistFile)))


+ 19
- 20
src/native/windows/juce_win32_NativeIncludes.h View File

@@ -187,48 +187,47 @@
/** A simple COM smart pointer.
Avoids having to include ATL just to get one of these.
*/
template <class T>
template <class ComClass>
class ComSmartPtr
{
public:
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (T* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<T>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }
ComSmartPtr() throw() : p (0) {}
ComSmartPtr (ComClass* const p_) : p (p_) { if (p_ != 0) p_->AddRef(); }
ComSmartPtr (const ComSmartPtr<ComClass>& p_) : p (p_.p) { if (p != 0) p->AddRef(); }
~ComSmartPtr() { if (p != 0) p->Release(); }
operator T*() const throw() { return p; }
T& operator*() const throw() { return *p; }
T** operator&() throw() { return &p; }
T* operator->() const throw() { return p; }
operator ComClass*() const throw() { return p; }
ComClass& operator*() const throw() { return *p; }
ComClass** operator&() throw() { return &p; }
ComClass* operator->() const throw() { return p; }
T* operator= (T* const newP)
ComClass* operator= (ComClass* const newP)
{
if (newP != 0)
newP->AddRef();
if (p != 0)
p->Release();
if (newP != 0) newP->AddRef();
if (p != 0) p->Release();
p = newP;
return newP;
}
T* operator= (const ComSmartPtr<T>& newP) { return operator= (newP.p); }
ComClass* operator= (const ComSmartPtr<ComClass>& newP) { return operator= (newP.p); }
HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext)
HRESULT CoCreateInstance (REFCLSID rclsid, DWORD dwClsContext = CLSCTX_INPROC_SERVER)
{
#ifndef __MINGW32__
operator= (0);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof(T), (void**) &p);
return ::CoCreateInstance (rclsid, 0, dwClsContext, __uuidof (ComClass), (void**) &p);
#else
return S_FALSE;
#endif
}
T* p;
private:
ComClass* p;
};
//==============================================================================
/** Handy base class for writing COM objects, providing ref-counting and a basic QueryInterface method.
*/
template <class ComClass>
class ComBaseClassHelper : public ComClass
{


+ 2
- 2
src/native/windows/juce_win32_WASAPI.cpp View File

@@ -912,7 +912,7 @@ private:
bool createDevices()
{
ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return false;
ComSmartPtr <IMMDeviceCollection> deviceCollection;
@@ -976,7 +976,7 @@ public:
inputDeviceIds.clear();
ComSmartPtr <IMMDeviceEnumerator> enumerator;
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator), CLSCTX_INPROC_SERVER)))
if (! OK (enumerator.CoCreateInstance (__uuidof (MMDeviceEnumerator))))
return;
const String defaultRenderer = getDefaultEndpoint (enumerator, false);


+ 6
- 0
src/text/juce_StringArray.cpp View File

@@ -116,6 +116,12 @@ const String& StringArray::operator[] (const int index) const throw()
return String::empty;
}
String& StringArray::getReference (const int index) throw()
{
jassert (((unsigned int) index) < (unsigned int) strings.size());
return strings.getReference (index);
}
void StringArray::add (const String& newString)
{
strings.add (newString);


+ 6
- 0
src/text/juce_StringArray.h View File

@@ -108,6 +108,12 @@ public:
*/
const String& operator[] (int index) const throw();
/** Returns a reference to one of the strings in the array.
This lets you modify a string in-place in the array, but you must be sure that
the index is in-range.
*/
String& getReference (int index) throw();
/** Searches for a string in the array.
The comparison will be case-insensitive if the ignoreCase parameter is true.


Loading…
Cancel
Save