mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
Changed SparseSet to work with Range objects. Fixed array sorting bug.
This commit is contained in:
parent
21006fbd0a
commit
9c5651fb8e
14 changed files with 251 additions and 310 deletions
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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()));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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)))
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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…
Add table
Add a link
Reference in a new issue