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