@@ -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. | |||