@@ -230,7 +230,7 @@ public: | |||||
} | } | ||||
template <class OtherArrayType> | template <class OtherArrayType> | ||||
typename std::enable_if<! std::is_pointer<OtherArrayType>::value, void>::type | |||||
typename std::enable_if<! std::is_pointer<OtherArrayType>::value, int>::type | |||||
addArray (const OtherArrayType& arrayToAddFrom, | addArray (const OtherArrayType& arrayToAddFrom, | ||||
int startIndex, int numElementsToAdd = -1) | int startIndex, int numElementsToAdd = -1) | ||||
{ | { | ||||
@@ -244,6 +244,8 @@ public: | |||||
numElementsToAdd = (int) arrayToAddFrom.size() - startIndex; | numElementsToAdd = (int) arrayToAddFrom.size() - startIndex; | ||||
addArray (arrayToAddFrom.data() + startIndex, numElementsToAdd); | addArray (arrayToAddFrom.data() + startIndex, numElementsToAdd); | ||||
return numElementsToAdd; | |||||
} | } | ||||
//============================================================================== | //============================================================================== | ||||
@@ -0,0 +1,76 @@ | |||||
/* | |||||
============================================================================== | |||||
This file is part of the JUCE library. | |||||
Copyright (c) 2018 - ROLI Ltd. | |||||
JUCE is an open source library subject to commercial or open-source | |||||
licensing. | |||||
The code included in this file is provided under the terms of the ISC license | |||||
http://www.isc.org/downloads/software-support-policy/isc-license. Permission | |||||
To use, copy, modify, and/or distribute this software for any purpose with or | |||||
without fee is hereby granted provided that the above copyright notice and | |||||
this permission notice appear in all copies. | |||||
JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER | |||||
EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE | |||||
DISCLAIMED. | |||||
============================================================================== | |||||
*/ | |||||
namespace juce | |||||
{ | |||||
#if JUCE_UNIT_TESTS | |||||
class ReferenceCountedArrayTests : public UnitTest | |||||
{ | |||||
public: | |||||
ReferenceCountedArrayTests() : UnitTest ("ReferenceCountedArray", "Containers") {} | |||||
//============================================================================== | |||||
void runTest() override | |||||
{ | |||||
beginTest ("Add derived objects"); | |||||
{ | |||||
derivedObjects.add (static_cast<TestDerivedObj*> (new TestBaseObj())); | |||||
expectEquals (derivedObjects.size(), 1); | |||||
expectEquals (derivedObjects.getObjectPointer (0)->getReferenceCount(), 1); | |||||
expectEquals (derivedObjects[0]->getReferenceCount(), 2); | |||||
for (auto o : derivedObjects) | |||||
expectEquals (o->getReferenceCount(), 1); | |||||
for (auto o : getObjects()) | |||||
expectEquals (o->getReferenceCount(), 2); | |||||
} | |||||
} | |||||
private: | |||||
struct TestBaseObj : public ReferenceCountedObject | |||||
{ | |||||
TestBaseObj() = default; | |||||
}; | |||||
struct TestDerivedObj : public TestBaseObj | |||||
{ | |||||
TestDerivedObj() = default; | |||||
}; | |||||
ReferenceCountedArray<TestDerivedObj> derivedObjects; | |||||
ReferenceCountedArray<TestBaseObj> getObjects() const | |||||
{ | |||||
ReferenceCountedArray<TestBaseObj> objects; | |||||
objects.addArray (derivedObjects); | |||||
return objects; | |||||
} | |||||
}; | |||||
static ReferenceCountedArrayTests referenceCountedArrayTests; | |||||
#endif | |||||
} // namespace juce |
@@ -62,7 +62,7 @@ public: | |||||
ReferenceCountedArray (const ReferenceCountedArray& other) noexcept | ReferenceCountedArray (const ReferenceCountedArray& other) noexcept | ||||
{ | { | ||||
const ScopedLockType lock (other.getLock()); | const ScopedLockType lock (other.getLock()); | ||||
values.addArray (other.values.begin(), other.values.size()); | |||||
values.addArray (other.begin(), other.size()); | |||||
for (auto* o : *this) | for (auto* o : *this) | ||||
if (o != nullptr) | if (o != nullptr) | ||||
@@ -80,7 +80,6 @@ public: | |||||
ReferenceCountedArray (const ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>& other) noexcept | ReferenceCountedArray (const ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>& other) noexcept | ||||
{ | { | ||||
const typename ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>::ScopedLockType lock (other.getLock()); | const typename ReferenceCountedArray<OtherObjectClass, OtherCriticalSection>::ScopedLockType lock (other.getLock()); | ||||
values.addArray (other.begin(), other.size()); | values.addArray (other.begin(), other.size()); | ||||
for (auto* o : *this) | for (auto* o : *this) | ||||
@@ -466,11 +465,11 @@ public: | |||||
{ | { | ||||
const ScopedLockType lock2 (getLock()); | const ScopedLockType lock2 (getLock()); | ||||
values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd); | |||||
auto newSize = values.size(); | |||||
auto numElementsAdded = values.addArray (arrayToAddFrom.values, startIndex, numElementsToAdd); | |||||
auto** e = values.end(); | |||||
for (int i = newSize - numElementsToAdd; i < newSize; ++i) | |||||
values[i]->incReferenceCount(); | |||||
for (int i = 0; i < numElementsAdded; ++i) | |||||
(*(--e))->incReferenceCount(); | |||||
} | } | ||||
} | } | ||||
@@ -119,6 +119,7 @@ | |||||
//============================================================================== | //============================================================================== | ||||
#include "containers/juce_AbstractFifo.cpp" | #include "containers/juce_AbstractFifo.cpp" | ||||
#include "containers/juce_ArrayBase.cpp" | #include "containers/juce_ArrayBase.cpp" | ||||
#include "containers/juce_ReferenceCountedArray.cpp" | |||||
#include "containers/juce_NamedValueSet.cpp" | #include "containers/juce_NamedValueSet.cpp" | ||||
#include "containers/juce_PropertySet.cpp" | #include "containers/juce_PropertySet.cpp" | ||||
#include "containers/juce_SparseSet.cpp" | #include "containers/juce_SparseSet.cpp" | ||||