From 1e6bbb8da98448279727df3be71efa52e8605ac2 Mon Sep 17 00:00:00 2001 From: jules Date: Tue, 3 Jul 2018 11:51:13 +0100 Subject: [PATCH] Added some methods to allow ReferenceCountedObjectPtrs to be constructed or copied from references as well as pointers - as well as increasing safety, this actually makes things a bit more efficient as it skips a nullptr check. Updated lots of places in the code that could take advantage of this --- .../Source/Licenses/jucer_LicenseThread.h | 10 +- .../jucer_CompileEngineClient.h | 4 +- .../jucer_ProjectExport_Android.h | 2 +- .../ProjectSaving/jucer_ProjectExport_CLion.h | 2 +- .../jucer_ProjectExport_CodeBlocks.h | 2 +- .../ProjectSaving/jucer_ProjectExport_MSVC.h | 2 +- .../ProjectSaving/jucer_ProjectExport_Make.h | 2 +- .../ProjectSaving/jucer_ProjectExport_Xcode.h | 6 +- .../processors/juce_AudioProcessorGraph.cpp | 2 +- .../topology/juce_PhysicalTopologySource.cpp | 4 +- .../containers/juce_ReferenceCountedArray.h | 6 +- .../juce_core/javascript/juce_Javascript.cpp | 15 +-- modules/juce_core/maths/juce_Expression.cpp | 112 +++++++++--------- .../memory/juce_ReferenceCountedObject.h | 64 +++++++--- modules/juce_core/memory/juce_WeakReference.h | 2 +- .../juce_core/native/juce_osx_ObjCHelpers.h | 2 +- .../values/juce_ValueTree.cpp | 111 +++++++++-------- .../values/juce_ValueTree.h | 3 +- .../filter_design/juce_FilterDesign.cpp | 8 +- .../processors/juce_FIRFilter_test.cpp | 2 +- .../juce_dsp/processors/juce_IIRFilter.cpp | 62 +++++----- .../broadcasters/juce_AsyncUpdater.cpp | 2 +- .../messages/juce_MessageManager.cpp | 2 +- modules/juce_graphics/fonts/juce_Font.cpp | 2 +- modules/juce_graphics/fonts/juce_Typeface.cpp | 9 +- modules/juce_graphics/images/juce_Image.cpp | 14 +-- .../native/juce_RenderingHelpers.h | 48 ++++---- .../native/juce_mac_CoreGraphicsContext.mm | 6 +- .../juce_graphics/native/juce_mac_Fonts.mm | 4 +- .../lookandfeel/juce_LookAndFeel.cpp | 2 +- .../juce_gui_basics/menus/juce_PopupMenu.cpp | 2 +- .../juce_opengl/opengl/juce_OpenGLContext.cpp | 27 +++-- .../opengl/juce_OpenGLGraphicsContext.cpp | 11 +- .../juce_opengl/opengl/juce_OpenGLImage.cpp | 8 +- 34 files changed, 309 insertions(+), 251 deletions(-) diff --git a/extras/Projucer/Source/Licenses/jucer_LicenseThread.h b/extras/Projucer/Source/Licenses/jucer_LicenseThread.h index 3a51bca4b3..9c1e1f20b4 100644 --- a/extras/Projucer/Source/Licenses/jucer_LicenseThread.h +++ b/extras/Projucer/Source/Licenses/jucer_LicenseThread.h @@ -269,10 +269,10 @@ struct LicenseThread : NetWorkerThread if (productKey.isNotEmpty()) { - DynamicObject::Ptr redeamObject = new DynamicObject(); - redeamObject->setProperty (serialIdentifier, productKey); + DynamicObject::Ptr redeemObject (new DynamicObject()); + redeemObject->setProperty (serialIdentifier, productKey); - String postData (JSON::toString (var (redeamObject.get()))); + String postData (JSON::toString (var (redeemObject.get()))); std::unique_ptr shared (getSharedWebInputStream (URL ("https://api.roli.com/api/v1/user/products").withPOSTData (postData), true)); @@ -295,12 +295,12 @@ struct LicenseThread : NetWorkerThread if (chosenLicenseType.isNotEmpty()) { // redeem the license - DynamicObject::Ptr jsonLicenseObject = new DynamicObject(); + DynamicObject::Ptr jsonLicenseObject (new DynamicObject()); jsonLicenseObject->setProperty (projucerLicenseTypeIdentifier, chosenLicenseType); jsonLicenseObject->setProperty (versionIdentifier, 5); - DynamicObject::Ptr jsonLicenseRequest = new DynamicObject(); + DynamicObject::Ptr jsonLicenseRequest (new DynamicObject()); jsonLicenseRequest->setProperty (licenseIdentifier, var (jsonLicenseObject.get())); jsonLicenseRequest->setProperty (searchInternalIdentifier, "com.roli.projucer"); jsonLicenseRequest->setProperty (licenseTypeIdentifier, "software"); diff --git a/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h index d52ed40814..1732424097 100644 --- a/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h +++ b/extras/Projucer/Source/LiveBuildEngine/jucer_CompileEngineClient.h @@ -119,7 +119,7 @@ struct ChildProcessCache { for (auto& p : processes) if (&(p->project) == &project) - return p; + return *p; return {}; } @@ -132,7 +132,7 @@ struct ChildProcessCache auto p = new CompileEngineChildProcess (project); tellNewProcessAboutExistingEditors (*p); processes.add (p); - return p; + return *p; } static void tellNewProcessAboutExistingEditors (CompileEngineChildProcess& process) diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h index fd009d48c4..161d5da623 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Android.h @@ -355,7 +355,7 @@ protected: BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override { - return new AndroidBuildConfiguration (project, v, *this); + return *new AndroidBuildConfiguration (project, v, *this); } private: diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h index a79f4e9d4e..9dd20e1b5a 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CLion.h @@ -49,7 +49,7 @@ protected: BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override { - return new CLionBuildConfiguration (project, tree, *this); + return *new CLionBuildConfiguration (project, tree, *this); } public: diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h index 1da30c694f..d8295d0b21 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_CodeBlocks.h @@ -235,7 +235,7 @@ private: BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override { - return new CodeBlocksBuildConfiguration (project, tree, *this); + return *new CodeBlocksBuildConfiguration (project, tree, *this); } //============================================================================== diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h index a1689db6b3..eb3e180cb8 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_MSVC.h @@ -1517,7 +1517,7 @@ protected: BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override { - return new MSVCBuildConfiguration (project, v, *this); + return *new MSVCBuildConfiguration (project, v, *this); } StringArray getHeaderSearchPaths (const BuildConfiguration& config) const diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h index 3cbc270360..0a01e7c7f3 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Make.h @@ -78,7 +78,7 @@ protected: BuildConfiguration::Ptr createBuildConfig (const ValueTree& tree) const override { - return new MakeBuildConfiguration (project, tree, *this); + return *new MakeBuildConfiguration (project, tree, *this); } public: diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index a9b8645e5a..34f6a95a8f 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -625,7 +625,7 @@ protected: BuildConfiguration::Ptr createBuildConfig (const ValueTree& v) const override { - return new XcodeBuildConfiguration (project, v, iOS, *this); + return *new XcodeBuildConfiguration (project, v, iOS, *this); } public: @@ -3078,7 +3078,7 @@ private: for (auto& type : getiOSAppIconTypes()) { - DynamicObject::Ptr d = new DynamicObject(); + DynamicObject::Ptr d (new DynamicObject()); d->setProperty ("idiom", type.idiom); d->setProperty ("size", type.sizeString); d->setProperty ("filename", type.filename); @@ -3146,7 +3146,7 @@ private: for (auto& type : getiOSLaunchImageTypes()) { - DynamicObject::Ptr d = new DynamicObject(); + DynamicObject::Ptr d (new DynamicObject()); d->setProperty ("orientation", type.orientation); d->setProperty ("idiom", type.idiom); d->setProperty ("extent", type.extent); diff --git a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp index db506860f0..d799ff05c6 100644 --- a/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp +++ b/modules/juce_audio_processors/processors/juce_AudioProcessorGraph.cpp @@ -686,7 +686,7 @@ struct RenderSequenceBuilder if (numOuts == 0) totalLatency = maxLatency; - sequence.addProcessOp (&node, audioChannelsToUse, totalChans, midiBufferToUse); + sequence.addProcessOp (node, audioChannelsToUse, totalChans, midiBufferToUse); } //============================================================================== diff --git a/modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp b/modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp index 900ab64a57..a932c3e55c 100644 --- a/modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp +++ b/modules/juce_blocks_basics/topology/juce_PhysicalTopologySource.cpp @@ -1318,7 +1318,7 @@ struct PhysicalTopologySource::Internal bi->rotation = 0; } - layoutNeighbours (block, topology, block->uid, visited); + layoutNeighbours (*block, topology, block->uid, visited); } } } @@ -1327,7 +1327,7 @@ struct PhysicalTopologySource::Internal { for (auto& block : topology.blocks) if (block->uid == uid) - return block; + return *block; return {}; } diff --git a/modules/juce_core/containers/juce_ReferenceCountedArray.h b/modules/juce_core/containers/juce_ReferenceCountedArray.h index 14c0ad8d1d..6e8ad80c52 100644 --- a/modules/juce_core/containers/juce_ReferenceCountedArray.h +++ b/modules/juce_core/containers/juce_ReferenceCountedArray.h @@ -178,7 +178,7 @@ public: */ inline ObjectClassPtr operator[] (int index) const noexcept { - return getObjectPointer (index); + return ObjectClassPtr (getObjectPointer (index)); } /** Returns a pointer to the object at this index in the array, without checking @@ -189,7 +189,7 @@ public: */ inline ObjectClassPtr getUnchecked (int index) const noexcept { - return getObjectPointerUnchecked (index); + return ObjectClassPtr (getObjectPointerUnchecked (index)); } /** Returns a raw pointer to the object at this index in the array. @@ -253,7 +253,7 @@ public: if (numUsed > 0) { jassert (data.elements != nullptr); - return data.elements[numUsed - 1]; + return ObjectClassPtr (data.elements[numUsed - 1]); } return {}; diff --git a/modules/juce_core/javascript/juce_Javascript.cpp b/modules/juce_core/javascript/juce_Javascript.cpp index 8018a7cb19..bdc8ee2df0 100644 --- a/modules/juce_core/javascript/juce_Javascript.cpp +++ b/modules/juce_core/javascript/juce_Javascript.cpp @@ -81,13 +81,13 @@ struct JavascriptEngine::RootObject : public DynamicObject void execute (const String& code) { ExpressionTreeBuilder tb (code); - std::unique_ptr (tb.parseStatementList())->perform (Scope (nullptr, this, this), nullptr); + std::unique_ptr (tb.parseStatementList())->perform (Scope ({}, *this, *this), nullptr); } var evaluate (const String& code) { ExpressionTreeBuilder tb (code); - return ExpPtr (tb.parseExpression())->getResult (Scope (nullptr, this, this)); + return ExpPtr (tb.parseExpression())->getResult (Scope ({}, *this, *this)); } //============================================================================== @@ -210,7 +210,7 @@ struct JavascriptEngine::RootObject : public DynamicObject for (int i = 0; i < props.size(); ++i) if (auto* o = props.getValueAt (i).getDynamicObject()) - if (Scope (this, root, o).findAndInvokeMethod (function, args, result)) + if (Scope (this, *root, *o).findAndInvokeMethod (function, args, result)) return true; return false; @@ -833,7 +833,7 @@ struct JavascriptEngine::RootObject : public DynamicObject tb.parseFunctionParamsAndBody (*this); } - DynamicObject::Ptr clone() override { return new FunctionObject (*this); } + DynamicObject::Ptr clone() override { return *new FunctionObject (*this); } void writeAsJSON (OutputStream& out, int /*indentLevel*/, bool /*allOnOneLine*/, int /*maximumDecimalPlaces*/) override { @@ -1875,7 +1875,7 @@ var JavascriptEngine::callFunction (const Identifier& function, const var::Nativ { prepareTimeout(); if (result != nullptr) *result = Result::ok(); - RootObject::Scope ({}, root, root).findAndInvokeMethod (function, args, returnVal); + RootObject::Scope ({}, *root, *root).findAndInvokeMethod (function, args, returnVal); } catch (String& error) { @@ -1894,8 +1894,9 @@ var JavascriptEngine::callFunctionObject (DynamicObject* objectScope, const var& { prepareTimeout(); if (result != nullptr) *result = Result::ok(); - RootObject::Scope rootScope ({}, root, root); - RootObject::Scope (&rootScope, root, objectScope).invokeMethod (functionObject, args, returnVal); + RootObject::Scope rootScope ({}, *root, *root); + RootObject::Scope (&rootScope, *root, DynamicObject::Ptr (objectScope)) + .invokeMethod (functionObject, args, returnVal); } catch (String& error) { diff --git a/modules/juce_core/maths/juce_Expression.cpp b/modules/juce_core/maths/juce_Expression.cpp index ecf5003a47..e6990ffddd 100644 --- a/modules/juce_core/maths/juce_Expression.cpp +++ b/modules/juce_core/maths/juce_Expression.cpp @@ -112,9 +112,9 @@ struct Expression::Helpers Type getType() const noexcept { return constantType; } Term* clone() const { return new Constant (value, isResolutionTarget); } - TermPtr resolve (const Scope&, int) { return this; } + TermPtr resolve (const Scope&, int) { return *this; } double toDouble() const { return value; } - TermPtr negated() { return new Constant (-value, isResolutionTarget); } + TermPtr negated() { return *new Constant (-value, isResolutionTarget); } String toString() const { @@ -152,15 +152,15 @@ struct Expression::Helpers TermPtr resolve (const Scope& scope, int recursionDepth) { - return new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(), - right->resolve (scope, recursionDepth)->toDouble()), false); + return *new Constant (performFunction (left ->resolve (scope, recursionDepth)->toDouble(), + right->resolve (scope, recursionDepth)->toDouble()), false); } String toString() const { String s; - - const int ourPrecendence = getOperatorPrecedence(); + auto ourPrecendence = getOperatorPrecedence(); + if (left->getOperatorPrecedence() > ourPrecendence) s << '(' << left->toString() << ')'; else @@ -188,7 +188,7 @@ struct Expression::Helpers if (auto dest = findDestinationFor (topLevelTerm, this)) return dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm); - return new Constant (overallTarget, false); + return *new Constant (overallTarget, false); } }; @@ -261,7 +261,7 @@ struct Expression::Helpers result = scope.evaluateFunction (functionName, nullptr, 0); } - return new Constant (result, false); + return *new Constant (result, false); } int getInputIndexFor (const Term* possibleInput) const @@ -300,7 +300,7 @@ struct Expression::Helpers class DotOperator : public BinaryTerm { public: - DotOperator (SymbolTerm* const l, TermPtr r) : BinaryTerm (l, r) {} + DotOperator (SymbolTerm* l, TermPtr r) : BinaryTerm (TermPtr (l), r) {} TermPtr resolve (const Scope& scope, int recursionDepth) { @@ -311,7 +311,7 @@ struct Expression::Helpers return visitor.output; } - Term* clone() const { return new DotOperator (getSymbol(), right.get()); } + Term* clone() const { return new DotOperator (getSymbol(), *right); } String getName() const { return "."; } int getOperatorPrecedence() const { return 1; } void writeOperator (String& dest) const { dest << '.'; } @@ -414,11 +414,11 @@ struct Expression::Helpers int getInputIndexFor (const Term* possibleInput) const { return possibleInput == input ? 0 : -1; } int getNumInputs() const { return 1; } Term* getInput (int index) const { return index == 0 ? input.get() : nullptr; } - Term* clone() const { return new Negate (input->clone()); } + Term* clone() const { return new Negate (*input->clone()); } TermPtr resolve (const Scope& scope, int recursionDepth) { - return new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false); + return *new Constant (-input->resolve (scope, recursionDepth)->toDouble(), false); } String getName() const { return "-"; } @@ -431,8 +431,8 @@ struct Expression::Helpers const Term* const dest = findDestinationFor (topLevelTerm, this); - return new Negate (dest == nullptr ? new Constant (overallTarget, false) - : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm)); + return *new Negate (dest == nullptr ? TermPtr (*new Constant (overallTarget, false)) + : dest->createTermToEvaluateInput (scope, this, overallTarget, topLevelTerm)); } String toString() const @@ -453,7 +453,7 @@ struct Expression::Helpers public: Add (TermPtr l, TermPtr r) : BinaryTerm (l, r) {} - Term* clone() const { return new Add (left->clone(), right->clone()); } + Term* clone() const { return new Add (*left->clone(), *right->clone()); } double performFunction (double lhs, double rhs) const { return lhs + rhs; } int getOperatorPrecedence() const { return 3; } String getName() const { return "+"; } @@ -462,7 +462,7 @@ struct Expression::Helpers TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const { if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm)) - return new Subtract (newDest, (input == left ? right : left)->clone()); + return *new Subtract (newDest, *(input == left ? right : left)->clone()); return {}; } @@ -477,7 +477,7 @@ struct Expression::Helpers public: Subtract (TermPtr l, TermPtr r) : BinaryTerm (l, r) {} - Term* clone() const { return new Subtract (left->clone(), right->clone()); } + Term* clone() const { return new Subtract (*left->clone(), *right->clone()); } double performFunction (double lhs, double rhs) const { return lhs - rhs; } int getOperatorPrecedence() const { return 3; } String getName() const { return "-"; } @@ -488,9 +488,9 @@ struct Expression::Helpers if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm)) { if (input == left) - return new Add (newDest, right->clone()); + return *new Add (*newDest, *right->clone()); - return new Subtract (left->clone(), newDest); + return *new Subtract (*left->clone(), *newDest); } return {}; @@ -506,7 +506,7 @@ struct Expression::Helpers public: Multiply (TermPtr l, TermPtr r) : BinaryTerm (l, r) {} - Term* clone() const { return new Multiply (left->clone(), right->clone()); } + Term* clone() const { return new Multiply (*left->clone(), *right->clone()); } double performFunction (double lhs, double rhs) const { return lhs * rhs; } String getName() const { return "*"; } void writeOperator (String& dest) const { dest << " * "; } @@ -515,7 +515,7 @@ struct Expression::Helpers TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const { if (auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm)) - return new Divide (newDest, (input == left ? right : left)->clone()); + return *new Divide (newDest, *(input == left ? right : left)->clone()); return {}; } @@ -529,7 +529,7 @@ struct Expression::Helpers public: Divide (TermPtr l, TermPtr r) : BinaryTerm (l, r) {} - Term* clone() const { return new Divide (left->clone(), right->clone()); } + Term* clone() const { return new Divide (*left->clone(), *right->clone()); } double performFunction (double lhs, double rhs) const { return lhs / rhs; } String getName() const { return "/"; } void writeOperator (String& dest) const { dest << " / "; } @@ -537,14 +537,15 @@ struct Expression::Helpers TermPtr createTermToEvaluateInput (const Scope& scope, const Term* input, double overallTarget, Term* topLevelTerm) const { - const TermPtr newDest (createDestinationTerm (scope, input, overallTarget, topLevelTerm)); + auto newDest = createDestinationTerm (scope, input, overallTarget, topLevelTerm); + if (newDest == nullptr) return {}; if (input == left) - return new Multiply (newDest, right->clone()); + return *new Multiply (*newDest, *right->clone()); - return new Divide (left->clone(), newDest); + return *new Divide (*left->clone(), *newDest); } JUCE_DECLARE_NON_COPYABLE (Divide) @@ -598,11 +599,8 @@ struct Expression::Helpers } for (int i = 0; i < numIns; ++i) - { - Constant* const c = findTermToAdjust (term->getInput (i), mustBeFlagged); - if (c != nullptr) + if (auto c = findTermToAdjust (term->getInput (i), mustBeFlagged)) return c; - } return nullptr; } @@ -659,9 +657,9 @@ struct Expression::Helpers TermPtr readUpToComma() { if (text.isEmpty()) - return new Constant (0.0, false); + return *new Constant (0.0, false); - const TermPtr e (readExpression()); + auto e = readExpression(); if (e == nullptr || ((! readOperator (",")) && ! text.isEmpty())) return parseError ("Syntax error: \"" + String (text) + "\""); @@ -674,12 +672,12 @@ struct Expression::Helpers private: String::CharPointerType& text; - Term* parseError (const String& message) + TermPtr parseError (const String& message) { if (error.isEmpty()) error = message; - return nullptr; + return {}; } //============================================================================== @@ -774,20 +772,20 @@ struct Expression::Helpers TermPtr readExpression() { - TermPtr lhs (readMultiplyOrDivideExpression()); - + auto lhs = readMultiplyOrDivideExpression(); char opType; + while (lhs != nullptr && readOperator ("+-", &opType)) { - TermPtr rhs (readMultiplyOrDivideExpression()); + auto rhs = readMultiplyOrDivideExpression(); if (rhs == nullptr) return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); if (opType == '+') - lhs = new Add (lhs, rhs); + lhs = *new Add (lhs, rhs); else - lhs = new Subtract (lhs, rhs); + lhs = *new Subtract (lhs, rhs); } return lhs; @@ -795,9 +793,9 @@ struct Expression::Helpers TermPtr readMultiplyOrDivideExpression() { - TermPtr lhs (readUnaryExpression()); - + auto lhs = readUnaryExpression(); char opType; + while (lhs != nullptr && readOperator ("*/", &opType)) { TermPtr rhs (readUnaryExpression()); @@ -806,9 +804,9 @@ struct Expression::Helpers return parseError ("Expected expression after \"" + String::charToString ((juce_wchar) (uint8) opType) + "\""); if (opType == '*') - lhs = new Multiply (lhs, rhs); + lhs = *new Multiply (lhs, rhs); else - lhs = new Divide (lhs, rhs); + lhs = *new Divide (lhs, rhs); } return lhs; @@ -835,12 +833,10 @@ struct Expression::Helpers TermPtr readPrimaryExpression() { - TermPtr e (readParenthesisedExpression()); - if (e != nullptr) + if (auto e = readParenthesisedExpression()) return e; - e = readNumber(); - if (e != nullptr) + if (auto e = readNumber()) return e; return readSymbolOrFunction(); @@ -848,20 +844,21 @@ struct Expression::Helpers TermPtr readSymbolOrFunction() { - String identifier; + String identifier; + if (readIdentifier (identifier)) { if (readOperator ("(")) // method call... { - Function* const f = new Function (identifier); + auto f = new Function (identifier); std::unique_ptr func (f); // (can't use std::unique_ptr in MSVC) - TermPtr param (readExpression()); + auto param = readExpression(); if (param == nullptr) { if (readOperator (")")) - return func.release(); + return TermPtr (func.release()); return parseError ("Expected parameters after \"" + identifier + " (\""); } @@ -879,7 +876,7 @@ struct Expression::Helpers } if (readOperator (")")) - return func.release(); + return TermPtr (func.release()); return parseError ("Expected \")\""); } @@ -894,12 +891,12 @@ struct Expression::Helpers if (identifier == "this") return rhs; - return new DotOperator (new SymbolTerm (identifier), rhs); + return *new DotOperator (new SymbolTerm (identifier), rhs); } // just a symbol.. jassert (identifier.trim() == identifier); - return new SymbolTerm (identifier); + return *new SymbolTerm (identifier); } return {}; @@ -910,7 +907,8 @@ struct Expression::Helpers if (! readOperator ("(")) return {}; - const TermPtr e (readExpression()); + auto e = readExpression(); + if (e == nullptr || ! readOperator (")")) return {}; @@ -1020,14 +1018,14 @@ Expression Expression::adjustedToGiveNewResult (const double targetValue, const { std::unique_ptr newTerm (term->clone()); - Helpers::Constant* termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true); + auto termToAdjust = Helpers::findTermToAdjust (newTerm.get(), true); if (termToAdjust == nullptr) termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false); if (termToAdjust == nullptr) { - newTerm.reset (new Helpers::Add (newTerm.release(), new Helpers::Constant (0, false))); + newTerm.reset (new Helpers::Add (*newTerm.release(), *new Helpers::Constant (0, false))); termToAdjust = Helpers::findTermToAdjust (newTerm.get(), false); } @@ -1095,7 +1093,7 @@ Expression Expression::getInput (int index) const { return Expression (ter //============================================================================== ReferenceCountedObjectPtr Expression::Term::negated() { - return new Helpers::Negate (this); + return *new Helpers::Negate (*this); } //============================================================================== diff --git a/modules/juce_core/memory/juce_ReferenceCountedObject.h b/modules/juce_core/memory/juce_ReferenceCountedObject.h index 8d8e726766..4312d020e7 100644 --- a/modules/juce_core/memory/juce_ReferenceCountedObject.h +++ b/modules/juce_core/memory/juce_ReferenceCountedObject.h @@ -260,6 +260,15 @@ public: incIfNotNull (refCountedObject); } + /** Creates a pointer to an object. + This will increment the object's reference-count. + */ + ReferenceCountedObjectPtr (ReferencedType& refCountedObject) noexcept + : referencedObject (&refCountedObject) + { + refCountedObject.incReferenceCount(); + } + /** Copies another pointer. This will increment the object's reference-count. */ @@ -310,19 +319,40 @@ public: The reference count of the old object is decremented, and it might be deleted if it hits zero. The new object's count is incremented. */ - ReferenceCountedObjectPtr& operator= (ReferencedType* newObject) - { - if (referencedObject != newObject) - { - incIfNotNull (newObject); - auto* oldObject = referencedObject; - referencedObject = newObject; - decIfNotNull (oldObject); - } - - return *this; - } + ReferenceCountedObjectPtr& operator= (ReferencedType* newObject) + { + if (newObject != nullptr) + return operator= (*newObject); + + reset(); + return *this; + } + /** Changes this pointer to point at a different object. + + The reference count of the old object is decremented, and it might be + deleted if it hits zero. The new object's count is incremented. + */ + ReferenceCountedObjectPtr& operator= (ReferencedType& newObject) + { + if (referencedObject != &newObject) + { + newObject.incReferenceCount(); + auto* oldObject = referencedObject; + referencedObject = &newObject; + decIfNotNull (oldObject); + } + + return *this; + } + + /** Resets this pointer to a null pointer. */ + ReferenceCountedObjectPtr& operator= (decltype (nullptr)) + { + reset(); + return *this; + } + /** Takes-over the object from another pointer. */ ReferenceCountedObjectPtr& operator= (ReferenceCountedObjectPtr&& other) noexcept { @@ -335,8 +365,8 @@ public: object to be deleted when the ref-count hits zero. */ ~ReferenceCountedObjectPtr() - { - decIfNotNull (referencedObject); + { + reset(); } //============================================================================== @@ -344,6 +374,12 @@ public: The pointer returned may be null, of course. */ ReferencedType* get() const noexcept { return referencedObject; } + + /** Resets this object to a null pointer. */ + void reset() noexcept + { + decIfNotNull (referencedObject); + } // the -> operator is called on the referenced object ReferencedType* operator->() const noexcept diff --git a/modules/juce_core/memory/juce_WeakReference.h b/modules/juce_core/memory/juce_WeakReference.h index 572e34a4ff..62484211cc 100644 --- a/modules/juce_core/memory/juce_WeakReference.h +++ b/modules/juce_core/memory/juce_WeakReference.h @@ -170,7 +170,7 @@ public: { if (sharedPointer == nullptr) { - sharedPointer = new SharedPointer (object); + sharedPointer = *new SharedPointer (object); } else { diff --git a/modules/juce_core/native/juce_osx_ObjCHelpers.h b/modules/juce_core/native/juce_osx_ObjCHelpers.h index 1efe548e94..f461bc3863 100644 --- a/modules/juce_core/native/juce_osx_ObjCHelpers.h +++ b/modules/juce_core/native/juce_osx_ObjCHelpers.h @@ -149,7 +149,7 @@ static var nsObjectToVar (NSObject* array); static var nsDictionaryToVar (NSDictionary* dictionary) { - DynamicObject::Ptr dynamicObject = new DynamicObject(); + DynamicObject::Ptr dynamicObject (new DynamicObject()); for (NSString* key in dictionary) dynamicObject->setProperty (nsStringToJuce (key), nsObjectToVar (dictionary[key])); diff --git a/modules/juce_data_structures/values/juce_ValueTree.cpp b/modules/juce_data_structures/values/juce_ValueTree.cpp index d3d034c869..12ec376aec 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.cpp +++ b/modules/juce_data_structures/values/juce_ValueTree.cpp @@ -60,9 +60,9 @@ public: } } - SharedObject* getRoot() noexcept + SharedObject& getRoot() noexcept { - return parent == nullptr ? this : parent->getRoot(); + return parent == nullptr ? *this : parent->getRoot(); } template @@ -97,31 +97,31 @@ public: void sendPropertyChangeMessage (const Identifier& property, ValueTree::Listener* listenerToExclude = nullptr) { - ValueTree tree (this); + ValueTree tree (*this); callListenersForAllParents (listenerToExclude, [&] (Listener& l) { l.valueTreePropertyChanged (tree, property); }); } void sendChildAddedMessage (ValueTree child) { - ValueTree tree (this); + ValueTree tree (*this); callListenersForAllParents (nullptr, [&] (Listener& l) { l.valueTreeChildAdded (tree, child); }); } void sendChildRemovedMessage (ValueTree child, int index) { - ValueTree tree (this); + ValueTree tree (*this); callListenersForAllParents (nullptr, [=, &tree, &child] (Listener& l) { l.valueTreeChildRemoved (tree, child, index); }); } void sendChildOrderChangedMessage (int oldIndex, int newIndex) { - ValueTree tree (this); + ValueTree tree (*this); callListenersForAllParents (nullptr, [=, &tree] (Listener& l) { l.valueTreeChildOrderChanged (tree, oldIndex, newIndex); }); } void sendParentChangeMessage() { - ValueTree tree (this); + ValueTree tree (*this); for (int j = children.size(); --j >= 0;) if (auto* child = children.getObjectPointer (j)) @@ -143,12 +143,12 @@ public: if (auto* existingValue = properties.getVarPointer (name)) { if (*existingValue != newValue) - undoManager->perform (new SetPropertyAction (this, name, newValue, *existingValue, + undoManager->perform (new SetPropertyAction (*this, name, newValue, *existingValue, false, false, listenerToExclude)); } else { - undoManager->perform (new SetPropertyAction (this, name, newValue, {}, + undoManager->perform (new SetPropertyAction (*this, name, newValue, {}, true, false, listenerToExclude)); } } @@ -169,7 +169,7 @@ public: else { if (properties.contains (name)) - undoManager->perform (new SetPropertyAction (this, name, {}, properties [name], false, true)); + undoManager->perform (new SetPropertyAction (*this, name, {}, properties [name], false, true)); } } @@ -187,7 +187,7 @@ public: else { for (int i = properties.size(); --i >= 0;) - undoManager->perform (new SetPropertyAction (this, properties.getName(i), {}, + undoManager->perform (new SetPropertyAction (*this, properties.getName(i), {}, properties.getValueAt(i), false, true)); } } @@ -206,7 +206,7 @@ public: { for (auto* s : children) if (s->type == typeToMatch) - return ValueTree (s); + return ValueTree (*s); return {}; } @@ -215,18 +215,18 @@ public: { for (auto* s : children) if (s->type == typeToMatch) - return ValueTree (s); + return ValueTree (*s); auto newObject = new SharedObject (typeToMatch); addChild (newObject, -1, undoManager); - return ValueTree (newObject); + return ValueTree (*newObject); } ValueTree getChildWithProperty (const Identifier& propertyName, const var& propertyValue) const { for (auto* s : children) if (s->properties[propertyName] == propertyValue) - return ValueTree (s); + return ValueTree (*s); return {}; } @@ -266,7 +266,7 @@ public: { children.insert (index, child); child->parent = this; - sendChildAddedMessage (ValueTree (child)); + sendChildAddedMessage (ValueTree (*child)); child->sendParentChangeMessage(); } else @@ -274,7 +274,7 @@ public: if (! isPositiveAndBelow (index, children.size())) index = children.size(); - undoManager->perform (new AddOrRemoveChildAction (this, index, child)); + undoManager->perform (new AddOrRemoveChildAction (*this, index, child)); } } else @@ -288,7 +288,7 @@ public: void removeChild (int childIndex, UndoManager* undoManager) { - if (Ptr child = children.getObjectPointer (childIndex)) + if (auto child = Ptr (children.getObjectPointer (childIndex))) { if (undoManager == nullptr) { @@ -299,7 +299,7 @@ public: } else { - undoManager->perform (new AddOrRemoveChildAction (this, childIndex, nullptr)); + undoManager->perform (new AddOrRemoveChildAction (*this, childIndex, {})); } } } @@ -328,7 +328,7 @@ public: if (! isPositiveAndBelow (newIndex, children.size())) newIndex = children.size() - 1; - undoManager->perform (new MoveChildAction (this, currentIndex, newIndex)); + undoManager->perform (new MoveChildAction (*this, currentIndex, newIndex)); } } } @@ -389,12 +389,12 @@ public: } output.writeCompressedInt (children.size()); - - for (int i = 0; i < children.size(); ++i) - writeObjectToStream (output, children.getObjectPointerUnchecked(i)); + + for (auto* c : children) + writeObjectToStream (output, c); } - static void writeObjectToStream (OutputStream& output, const Ptr& object) + static void writeObjectToStream (OutputStream& output, const SharedObject* object) { if (object != nullptr) { @@ -455,7 +455,7 @@ public: if (auto* next = dynamic_cast (nextAction)) if (next->target == target && next->name == name && ! (next->isAddingNewProperty || next->isDeletingProperty)) - return new SetPropertyAction (target, name, next->newValue, oldValue, false, false); + return new SetPropertyAction (*target, name, next->newValue, oldValue, false, false); } return nullptr; @@ -598,11 +598,9 @@ ValueTree::ValueTree (const Identifier& type, addChild (tree, -1, nullptr); } -ValueTree::ValueTree (ReferenceCountedObjectPtr so) noexcept - : object (static_cast&&> (so)) -{ -} - +ValueTree::ValueTree (SharedObject::Ptr so) noexcept : object (static_cast (so)) {} +ValueTree::ValueTree (SharedObject& so) noexcept : object (so) {} + ValueTree::ValueTree (const ValueTree& other) noexcept : object (other.object) { } @@ -663,8 +661,11 @@ bool ValueTree::isEquivalentTo (const ValueTree& other) const } ValueTree ValueTree::createCopy() const -{ - return ValueTree (createCopyIfNotNull (object.get())); +{ + if (object != nullptr) + return ValueTree (*new SharedObject (*object)); + + return {}; } void ValueTree::copyPropertiesFrom (const ValueTree& source, UndoManager* undoManager) @@ -700,24 +701,30 @@ Identifier ValueTree::getType() const noexcept } ValueTree ValueTree::getParent() const noexcept -{ - return ValueTree (object != nullptr ? object->parent - : static_cast (nullptr)); +{ + if (object != nullptr) + if (auto p = object->parent) + return ValueTree (*p); + + return {}; } ValueTree ValueTree::getRoot() const noexcept { - return ValueTree (object != nullptr ? object->getRoot() - : static_cast (nullptr)); + if (object != nullptr) + return ValueTree (object->getRoot()); + + return {}; } ValueTree ValueTree::getSibling (int delta) const noexcept { - if (object == nullptr || object->parent == nullptr) - return {}; - - auto index = object->parent->indexOf (*this) + delta; - return ValueTree (object->parent->children.getObjectPointer (index)); + if (object == nullptr) + if (auto p = object->parent) + if (auto c = p->children.getObjectPointer (p->indexOf (*this) + delta)) + return ValueTree (*c); + + return {}; } static const var& getNullVarRef() noexcept @@ -848,9 +855,12 @@ int ValueTree::getNumChildren() const noexcept } ValueTree ValueTree::getChild (int index) const -{ - return ValueTree (object != nullptr ? object->children.getObjectPointer (index) - : static_cast (nullptr)); +{ + if (object != nullptr) + if (auto c = object->children.getObjectPointer (index)) + return ValueTree (*c); + + return {}; } ValueTree::Iterator::Iterator (const ValueTree& v, bool isEnd) noexcept @@ -871,7 +881,7 @@ bool ValueTree::Iterator::operator!= (const Iterator& other) const noexcept ValueTree ValueTree::Iterator::operator*() const { - return ValueTree (*static_cast (internal)); + return ValueTree (SharedObject::Ptr (*static_cast (internal))); } ValueTree::Iterator ValueTree::begin() const noexcept { return Iterator (*this, false); } @@ -944,8 +954,11 @@ void ValueTree::createListOfChildren (OwnedArray& list) const { jassert (object != nullptr); - for (auto* o : object->children) - list.add (new ValueTree (o)); + for (auto* o : object->children) + { + jassert (o != nullptr); + list.add (new ValueTree (*o)); + } } void ValueTree::reorderChildren (const OwnedArray& newOrder, UndoManager* undoManager) @@ -1017,7 +1030,7 @@ String ValueTree::toXmlString() const //============================================================================== void ValueTree::writeToStream (OutputStream& output) const { - SharedObject::writeObjectToStream (output, object); + SharedObject::writeObjectToStream (output, object.get()); } ValueTree ValueTree::readFromStream (InputStream& input) diff --git a/modules/juce_data_structures/values/juce_ValueTree.h b/modules/juce_data_structures/values/juce_ValueTree.h index a24c3cd7c6..2339f8af14 100644 --- a/modules/juce_data_structures/values/juce_ValueTree.h +++ b/modules/juce_data_structures/values/juce_ValueTree.h @@ -632,7 +632,8 @@ private: void createListOfChildren (OwnedArray&) const; void reorderChildren (const OwnedArray&, UndoManager*); - explicit ValueTree (ReferenceCountedObjectPtr) noexcept; + explicit ValueTree (ReferenceCountedObjectPtr) noexcept; + explicit ValueTree (SharedObject&) noexcept; }; } // namespace juce diff --git a/modules/juce_dsp/filter_design/juce_FilterDesign.cpp b/modules/juce_dsp/filter_design/juce_FilterDesign.cpp index 19d5fcbf5b..691c921df0 100644 --- a/modules/juce_dsp/filter_design/juce_FilterDesign.cpp +++ b/modules/juce_dsp/filter_design/juce_FilterDesign.cpp @@ -60,7 +60,7 @@ typename FIR::Coefficients::Ptr WindowingFunction theWindow (order + 1, type, false, beta); theWindow.multiplyWithWindowingTable (c, order + 1); - return result; + return *result; } template @@ -121,7 +121,7 @@ typename FIR::Coefficients::Ptr } } - return result; + return *result; } template @@ -231,7 +231,7 @@ typename FIR::Coefficients::Ptr } } - return result; + return *result; } template @@ -290,7 +290,7 @@ typename FIR::Coefficients::Ptr c[2 * n + 1] = static_cast (0.5); - return result; + return *result; } template diff --git a/modules/juce_dsp/processors/juce_FIRFilter_test.cpp b/modules/juce_dsp/processors/juce_FIRFilter_test.cpp index 308ed20970..9f6da271c5 100644 --- a/modules/juce_dsp/processors/juce_FIRFilter_test.cpp +++ b/modules/juce_dsp/processors/juce_FIRFilter_test.cpp @@ -178,7 +178,7 @@ class FIRFilterTest : public UnitTest AudioBlock fir (firBlock, 1, static_cast (size)); fillRandom (random, fir.getChannelPointer (0), static_cast (size)); - FIR::Filter filter (new FIR::Coefficients (fir.getChannelPointer (0), static_cast (size))); + FIR::Filter filter (*new FIR::Coefficients (fir.getChannelPointer (0), static_cast (size))); ProcessSpec spec {0.0, n, 1}; filter.prepare (spec); diff --git a/modules/juce_dsp/processors/juce_IIRFilter.cpp b/modules/juce_dsp/processors/juce_IIRFilter.cpp index 7cdf2f32b4..359c547013 100644 --- a/modules/juce_dsp/processors/juce_IIRFilter.cpp +++ b/modules/juce_dsp/processors/juce_IIRFilter.cpp @@ -99,7 +99,7 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto n = std::tan (MathConstants::pi * frequency / static_cast (sampleRate)); - return new Coefficients (n, n, n + 1, n - 1); + return *new Coefficients (n, n, n + 1, n - 1); } template @@ -111,7 +111,7 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto n = std::tan (MathConstants::pi * frequency / static_cast (sampleRate)); - return new Coefficients (1, -1, n + 1, n - 1); + return *new Coefficients (1, -1, n + 1, n - 1); } template @@ -123,7 +123,7 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto n = std::tan (MathConstants::pi * frequency / static_cast (sampleRate)); - return new Coefficients (n - 1, n + 1, n + 1, n - 1); + return *new Coefficients (n - 1, n + 1, n + 1, n - 1); } template @@ -147,9 +147,9 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto invQ = 1 / Q; auto c1 = 1 / (1 + invQ * n + nSquared); - return new Coefficients (c1, c1 * 2, c1, - 1, c1 * 2 * (1 - nSquared), - c1 * (1 - invQ * n + nSquared)); + return *new Coefficients (c1, c1 * 2, c1, + 1, c1 * 2 * (1 - nSquared), + c1 * (1 - invQ * n + nSquared)); } template @@ -173,9 +173,9 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto invQ = 1 / Q; auto c1 = 1 / (1 + invQ * n + nSquared); - return new Coefficients (c1, c1 * -2, c1, - 1, c1 * 2 * (nSquared - 1), - c1 * (1 - invQ * n + nSquared)); + return *new Coefficients (c1, c1 * -2, c1, + 1, c1 * 2 * (nSquared - 1), + c1 * (1 - invQ * n + nSquared)); } template @@ -199,10 +199,10 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto invQ = 1 / Q; auto c1 = 1 / (1 + invQ * n + nSquared); - return new Coefficients (c1 * n * invQ, 0, - -c1 * n * invQ, 1, - c1 * 2 * (1 - nSquared), - c1 * (1 - invQ * n + nSquared)); + return *new Coefficients (c1 * n * invQ, 0, + -c1 * n * invQ, 1, + c1 * 2 * (1 - nSquared), + c1 * (1 - invQ * n + nSquared)); } template @@ -228,7 +228,7 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto b0 = c1 * (1 + nSquared); auto b1 = 2 * c1 * (1 - nSquared); - return new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared)); + return *new Coefficients (b0, b1, b0, 1, b1, c1 * (1 - n * invQ + nSquared)); } template @@ -254,7 +254,7 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto b0 = c1 * (1 - n * invQ + nSquared); auto b1 = c1 * 2 * (1 - nSquared); - return new Coefficients (b0, b1, 1, 1, b1, b0); + return *new Coefficients (b0, b1, 1, 1, b1, b0); } template @@ -275,12 +275,12 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto beta = std::sin (omega) * std::sqrt (A) / Q; auto aminus1TimesCoso = aminus1 * coso; - return new Coefficients (A * (aplus1 - aminus1TimesCoso + beta), - A * 2 * (aminus1 - aplus1 * coso), - A * (aplus1 - aminus1TimesCoso - beta), - aplus1 + aminus1TimesCoso + beta, - -2 * (aminus1 + aplus1 * coso), - aplus1 + aminus1TimesCoso - beta); + return *new Coefficients (A * (aplus1 - aminus1TimesCoso + beta), + A * 2 * (aminus1 - aplus1 * coso), + A * (aplus1 - aminus1TimesCoso - beta), + aplus1 + aminus1TimesCoso + beta, + -2 * (aminus1 + aplus1 * coso), + aplus1 + aminus1TimesCoso - beta); } template @@ -301,12 +301,12 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto beta = std::sin (omega) * std::sqrt (A) / Q; auto aminus1TimesCoso = aminus1 * coso; - return new Coefficients (A * (aplus1 + aminus1TimesCoso + beta), - A * -2 * (aminus1 + aplus1 * coso), - A * (aplus1 + aminus1TimesCoso - beta), - aplus1 - aminus1TimesCoso + beta, - 2 * (aminus1 - aplus1 * coso), - aplus1 - aminus1TimesCoso - beta); + return *new Coefficients (A * (aplus1 + aminus1TimesCoso + beta), + A * -2 * (aminus1 + aplus1 * coso), + A * (aplus1 + aminus1TimesCoso - beta), + aplus1 - aminus1TimesCoso + beta, + 2 * (aminus1 - aplus1 * coso), + aplus1 - aminus1TimesCoso - beta); } template @@ -327,10 +327,10 @@ typename IIR::Coefficients::Ptr IIR::Coefficients::mak auto alphaTimesA = alpha * A; auto alphaOverA = alpha / A; - return new Coefficients (1 + alphaTimesA, c2, - 1 - alphaTimesA, - 1 + alphaOverA, c2, - 1 - alphaOverA); + return *new Coefficients (1 + alphaTimesA, c2, + 1 - alphaTimesA, + 1 + alphaOverA, c2, + 1 - alphaOverA); } template diff --git a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp index 8d9a20e5a9..b745f5f8c2 100644 --- a/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp +++ b/modules/juce_events/broadcasters/juce_AsyncUpdater.cpp @@ -43,7 +43,7 @@ public: //============================================================================== AsyncUpdater::AsyncUpdater() { - activeMessage = new AsyncUpdaterMessage (*this); + activeMessage = *new AsyncUpdaterMessage (*this); } AsyncUpdater::~AsyncUpdater() diff --git a/modules/juce_events/messages/juce_MessageManager.cpp b/modules/juce_events/messages/juce_MessageManager.cpp index 320b41aeee..c162aba8a9 100644 --- a/modules/juce_events/messages/juce_MessageManager.cpp +++ b/modules/juce_events/messages/juce_MessageManager.cpp @@ -294,7 +294,7 @@ bool MessageManager::Lock::tryAcquire (bool lockIsMandatory) const noexcept try { - blockingMessage = new BlockingMessage (this); + blockingMessage = *new BlockingMessage (this); } catch (...) { diff --git a/modules/juce_graphics/fonts/juce_Font.cpp b/modules/juce_graphics/fonts/juce_Font.cpp index 0060099821..a0da9e81f7 100644 --- a/modules/juce_graphics/fonts/juce_Font.cpp +++ b/modules/juce_graphics/fonts/juce_Font.cpp @@ -308,7 +308,7 @@ bool Font::operator!= (const Font& other) const noexcept void Font::dupeInternalIfShared() { if (font->getReferenceCount() > 1) - font = new SharedFontInternal (*font); + font = *new SharedFontInternal (*font); } void Font::checkTypefaceSuitability() diff --git a/modules/juce_graphics/fonts/juce_Typeface.cpp b/modules/juce_graphics/fonts/juce_Typeface.cpp index eaee5033ba..fdd86f18ee 100644 --- a/modules/juce_graphics/fonts/juce_Typeface.cpp +++ b/modules/juce_graphics/fonts/juce_Typeface.cpp @@ -118,7 +118,7 @@ Typeface::~Typeface() Typeface::Ptr Typeface::getFallbackTypeface() { const Font fallbackFont (Font::getFallbackFontName(), Font::getFallbackFontStyle(), 10.0f); - return fallbackFont.getTypeface(); + return Typeface::Ptr (fallbackFont.getTypeface()); } EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransform& transform, float fontHeight) @@ -140,9 +140,8 @@ EdgeTable* Typeface::getEdgeTableForGlyph (int glyphNumber, const AffineTransfor struct Typeface::HintingParams { HintingParams (Typeface& t) - : cachedSize (0), top (0), middle (0), bottom (0) { - Font font (&t); + Font font (t); font = font.withHeight ((float) standardHeight); top = getAverageY (font, "BDEFPRTZOQ", true); @@ -209,7 +208,7 @@ private: float middle, upperScale, upperOffset, lowerScale, lowerOffset; }; - float cachedSize; + float cachedSize = 0; Scaling cachedScale; static float getAverageY (const Font& font, const char* chars, bool getTop) @@ -248,7 +247,7 @@ private: } enum { standardHeight = 100 }; - float top, middle, bottom; + float top = 0, middle = 0, bottom = 0; }; void Typeface::applyVerticalHintingTransform (float fontSize, Path& path) diff --git a/modules/juce_graphics/images/juce_Image.cpp b/modules/juce_graphics/images/juce_Image.cpp index a1221b3d3e..4bb9262e7a 100644 --- a/modules/juce_graphics/images/juce_Image.cpp +++ b/modules/juce_graphics/images/juce_Image.cpp @@ -93,7 +93,7 @@ public: LowLevelGraphicsContext* createLowLevelContext() override { sendDataChangeMessage(); - return new LowLevelGraphicsSoftwareRenderer (Image (this)); + return new LowLevelGraphicsSoftwareRenderer (Image (*this)); } void initialiseBitmapData (Image::BitmapData& bitmap, int x, int y, Image::BitmapData::ReadWriteMode mode) override @@ -109,9 +109,9 @@ public: ImagePixelData::Ptr clone() override { - SoftwarePixelData* s = new SoftwarePixelData (pixelFormat, width, height, false); + auto s = new SoftwarePixelData (pixelFormat, width, height, false); memcpy (s->imageData, imageData, (size_t) lineStride * (size_t) height); - return s; + return *s; } ImageType* createType() const override { return new SoftwareImageType(); } @@ -128,7 +128,7 @@ SoftwareImageType::~SoftwareImageType() {} ImagePixelData::Ptr SoftwareImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const { - return new SoftwarePixelData (format, width, height, clearImage); + return *new SoftwarePixelData (format, width, height, clearImage); } int SoftwareImageType::getTypeID() const @@ -187,10 +187,10 @@ public: { Graphics g (newImage); - g.drawImageAt (Image (this), 0, 0); + g.drawImageAt (Image (*this), 0, 0); } - return newImage.getPixelData(); + return *newImage.getPixelData(); } ImageType* createType() const override { return sourceImage->createType(); } @@ -216,7 +216,7 @@ Image Image::getClippedImage (const Rectangle& area) const if (validArea.isEmpty()) return {}; - return Image (new SubsectionPixelData (image, validArea)); + return Image (*new SubsectionPixelData (image, validArea)); } diff --git a/modules/juce_graphics/native/juce_RenderingHelpers.h b/modules/juce_graphics/native/juce_RenderingHelpers.h index b837e483c6..109c3348b7 100644 --- a/modules/juce_graphics/native/juce_RenderingHelpers.h +++ b/modules/juce_graphics/native/juce_RenderingHelpers.h @@ -216,7 +216,7 @@ private: { for (auto g : glyphs) if (g->glyph == glyphNumber && g->font == font) - return g; + return *g; return {}; } @@ -232,8 +232,8 @@ private: misses = 0; } - if (auto* g = findLeastRecentlyUsedGlyph()) - return g; + if (auto g = findLeastRecentlyUsedGlyph()) + return *g; addNewGlyphSlots (32); return glyphs.getLast(); @@ -1670,13 +1670,13 @@ struct ClipRegions using Ptr = typename Base::Ptr; - Ptr clone() const override { return new EdgeTableRegion (*this); } + Ptr clone() const override { return *new EdgeTableRegion (*this); } Ptr applyClipTo (const Ptr& target) const override { return target->clipToEdgeTable (edgeTable); } Ptr clipToRectangle (Rectangle r) override { edgeTable.clipToRectangle (r); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToRectangleList (const RectangleList& r) override @@ -1687,26 +1687,26 @@ struct ClipRegions for (auto& i : inverse) edgeTable.excludeRectangle (i); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } Ptr excludeClipRectangle (Rectangle r) override { edgeTable.excludeRectangle (r); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToPath (const Path& p, const AffineTransform& transform) override { EdgeTable et (edgeTable.getMaximumBounds(), p, transform); edgeTable.clipToEdgeTable (et); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToEdgeTable (const EdgeTable& et) override { edgeTable.clipToEdgeTable (et); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToImageAlpha (const Image& image, const AffineTransform& transform, Graphics::ResamplingQuality quality) override @@ -1729,7 +1729,7 @@ struct ClipRegions else straightClipImage (srcData, imageX, imageY, (PixelAlpha*) 0); - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } } @@ -1751,7 +1751,7 @@ struct ClipRegions transformedClipImage (srcData, transform, quality, (PixelAlpha*) 0); } - return edgeTable.isEmpty() ? nullptr : this; + return edgeTable.isEmpty() ? Ptr() : Ptr (*this); } void translate (Point delta) override @@ -1851,25 +1851,25 @@ struct ClipRegions using Ptr = typename Base::Ptr; - Ptr clone() const override { return new RectangleListRegion (*this); } + Ptr clone() const override { return *new RectangleListRegion (*this); } Ptr applyClipTo (const Ptr& target) const override { return target->clipToRectangleList (clip); } Ptr clipToRectangle (Rectangle r) override { clip.clipTo (r); - return clip.isEmpty() ? nullptr : this; + return clip.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToRectangleList (const RectangleList& r) override { clip.clipTo (r); - return clip.isEmpty() ? nullptr : this; + return clip.isEmpty() ? Ptr() : Ptr (*this); } Ptr excludeClipRectangle (Rectangle r) override { clip.subtract (r); - return clip.isEmpty() ? nullptr : this; + return clip.isEmpty() ? Ptr() : Ptr (*this); } Ptr clipToPath (const Path& p, const AffineTransform& transform) override { return toEdgeTable()->clipToPath (p, transform); } @@ -2068,7 +2068,7 @@ struct ClipRegions JUCE_DECLARE_NON_COPYABLE (SubRectangleIteratorFloat) }; - Ptr toEdgeTable() const { return new EdgeTableRegion (clip); } + Ptr toEdgeTable() const { return *new EdgeTableRegion (clip); } RectangleListRegion& operator= (const RectangleListRegion&); }; @@ -2267,7 +2267,7 @@ public: auto clipped = clip->getClipBounds().getIntersection (r); if (! clipped.isEmpty()) - fillShape (new RectangleListRegionType (clipped), false); + fillShape (*new RectangleListRegionType (clipped), false); } } @@ -2282,7 +2282,7 @@ public: auto clipped = clip->getClipBounds().toFloat().getIntersection (r); if (! clipped.isEmpty()) - fillShape (new EdgeTableRegionType (clipped), false); + fillShape (*new EdgeTableRegionType (clipped), false); } } @@ -2336,7 +2336,7 @@ public: if (transform.isIdentity()) { - fillShape (new EdgeTableRegionType (list), false); + fillShape (*new EdgeTableRegionType (list), false); } else if (! transform.isRotated) { @@ -2347,7 +2347,7 @@ public: else transformed.transformAll (transform.getTransform()); - fillShape (new EdgeTableRegionType (transformed), false); + fillShape (*new EdgeTableRegionType (transformed), false); } else { @@ -2364,7 +2364,7 @@ public: auto clipRect = clip->getClipBounds(); if (path.getBoundsTransformed (trans).getSmallestIntegerContainer().intersects (clipRect)) - fillShape (new EdgeTableRegionType (clipRect, path, trans), false); + fillShape (*new EdgeTableRegionType (clipRect, path, trans), false); } } @@ -2383,7 +2383,7 @@ public: edgeTableClip->edgeTable.multiplyLevels (1.0f + 1.6f * brightness); } - fillShape (edgeTableClip, false); + fillShape (*edgeTableClip, false); } } @@ -2434,7 +2434,7 @@ public: area = area.getIntersection (getThis().getMaximumBounds()); if (! area.isEmpty()) - if (auto c = clip->applyClipTo (new EdgeTableRegionType (area))) + if (auto c = clip->applyClipTo (*new EdgeTableRegionType (area))) c->renderImageUntransformed (getThis(), sourceImage, alpha, tx, ty, false); } @@ -2609,7 +2609,7 @@ public: std::unique_ptr et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight)); if (et != nullptr) - fillShape (new EdgeTableRegionType (*et), false); + fillShape (*new EdgeTableRegionType (*et), false); } } } diff --git a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm index fc8aaa284e..e40167bc50 100644 --- a/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm +++ b/modules/juce_graphics/native/juce_mac_CoreGraphicsContext.mm @@ -78,7 +78,7 @@ public: { auto im = new CoreGraphicsImage (pixelFormat, width, height, false); memcpy (im->imageData, imageData, (size_t) (lineStride * height)); - return im; + return *im; } ImageType* createType() const override { return new NativeImageType(); } @@ -162,7 +162,7 @@ private: ImagePixelData::Ptr NativeImageType::create (Image::PixelFormat format, int width, int height, bool clearImage) const { - return new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage); + return *new CoreGraphicsImage (format == Image::RGB ? Image::ARGB : format, width, height, clearImage); } //============================================================================== @@ -896,7 +896,7 @@ Image juce_createImageFromCIImage (CIImage* im, int w, int h) [cic drawImage: im inRect: CGRectMake (0, 0, w, h) fromRect: CGRectMake (0, 0, w, h)]; CGContextFlush (cgImage->context); - return Image (cgImage); + return Image (*cgImage); } CGImageRef juce_createCoreGraphicsImage (const Image& juceImage, CGColorSpaceRef colourSpace, diff --git a/modules/juce_graphics/native/juce_mac_Fonts.mm b/modules/juce_graphics/native/juce_mac_Fonts.mm index 3fccb40cb8..5d6277a86c 100644 --- a/modules/juce_graphics/native/juce_mac_Fonts.mm +++ b/modules/juce_graphics/native/juce_mac_Fonts.mm @@ -788,8 +788,8 @@ StringArray Font::findAllTypefaceStyles (const String& family) //============================================================================== -Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) { return new OSXTypeface (font); } -Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size) { return new OSXTypeface (data, size); } +Typeface::Ptr Typeface::createSystemTypefaceFor (const Font& font) { return *new OSXTypeface (font); } +Typeface::Ptr Typeface::createSystemTypefaceFor (const void* data, size_t size) { return *new OSXTypeface (data, size); } void Typeface::scanFolderForFonts (const File&) { diff --git a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp index 3ef5f993d8..6a1e196173 100644 --- a/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp +++ b/modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp @@ -147,7 +147,7 @@ void LookAndFeel::setDefaultSansSerifTypefaceName (const String& newName) { if (defaultSans != newName) { - defaultTypeface = {}; + defaultTypeface.reset(); Typeface::clearTypefaceCache(); defaultSans = newName; } diff --git a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp index 59a6b64162..204ade9a38 100644 --- a/modules/juce_gui_basics/menus/juce_PopupMenu.cpp +++ b/modules/juce_gui_basics/menus/juce_PopupMenu.cpp @@ -77,7 +77,7 @@ struct ItemComponent : public Component : item (i), customComp (i.customComponent) { if (item.isSectionHeader) - customComp = new HeaderItemComponent (item.text); + customComp = *new HeaderItemComponent (item.text); if (customComp != nullptr) addAndMakeVisible (*customComp); diff --git a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp index 29d1ec4cc8..ce00826ffa 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLContext.cpp @@ -589,16 +589,25 @@ public: void execute (OpenGLContext::AsyncWorker::Ptr workerToUse, bool shouldBlock, bool calledFromDestructor = false) { if (calledFromDestructor || destroying.get() == 0) - { - BlockingWorker* blocker = (shouldBlock ? new BlockingWorker (static_cast (workerToUse)) : nullptr); - OpenGLContext::AsyncWorker::Ptr worker = (blocker != nullptr ? blocker : static_cast (workerToUse)); - workQueue.add (worker); + { + if (shouldBlock) + { + auto blocker = new BlockingWorker (static_cast (workerToUse)); + OpenGLContext::AsyncWorker::Ptr worker (*blocker); + workQueue.add (worker); + + messageManagerLock.abort(); + context.triggerRepaint(); + + blocker->block(); + } + else + { + workQueue.add (static_cast (workerToUse)); - messageManagerLock.abort(); - context.triggerRepaint(); - - if (blocker != nullptr) - blocker->block(); + messageManagerLock.abort(); + context.triggerRepaint(); + } } else { diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index 6d59968305..94f4eb4456 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -111,10 +111,10 @@ struct CachedImageList : public ReferenceCountedObject, { TextureInfo t; - if (textureNeedsReloading) + if (textureNeedsReloading && pixelData != nullptr) { textureNeedsReloading = false; - texture.loadImage (Image (pixelData)); + texture.loadImage (Image (*pixelData)); } t.textureID = texture.getTextureID(); @@ -1660,7 +1660,7 @@ struct SavedState : public RenderingHelpers::SavedStateBase const std::unique_ptr et (font.getTypeface()->getEdgeTableForGlyph (glyphNumber, t, fontHeight)); if (et != nullptr) - fillShape (new EdgeTableRegionType (*et), false); + fillShape (*new EdgeTableRegionType (*et), false); } } } @@ -1844,8 +1844,9 @@ struct CustomProgram : public ReferenceCountedObject, static ReferenceCountedObjectPtr get (const String& hashName) { - if (auto* c = OpenGLContext::getCurrentContext()) - return static_cast (c->getAssociatedObject (hashName.toRawUTF8())); + if (auto* c = OpenGLContext::getCurrentContext()) + if (auto* o = c->getAssociatedObject (hashName.toRawUTF8())) + return *static_cast (o); return {}; } diff --git a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp index 44e5fcc0e9..36e21092ba 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLImage.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLImage.cpp @@ -53,11 +53,11 @@ public: ImagePixelData::Ptr clone() override { - Image newImage (new OpenGLFrameBufferImage (context, width, height)); + Image newImage (*new OpenGLFrameBufferImage (context, width, height)); Graphics g (newImage); - g.drawImageAt (Image (this), 0, 0, false); + g.drawImageAt (Image (*this), 0, 0, false); - return newImage.getPixelData(); + return ImagePixelData::Ptr (newImage.getPixelData()); } void initialiseBitmapData (Image::BitmapData& bitmapData, int x, int y, Image::BitmapData::ReadWriteMode mode) override @@ -193,7 +193,7 @@ ImagePixelData::Ptr OpenGLImageType::create (Image::PixelFormat, int width, int return ImagePixelData::Ptr(); im->frameBuffer.clear (Colours::transparentBlack); - return im.release(); + return *im.release(); } OpenGLFrameBuffer* OpenGLImageType::getFrameBufferFrom (const Image& image)