| @@ -120,12 +120,8 @@ bool NamedValueSet::isEmpty() const noexcept { return values.isEmpty(); } | |||||
| static const var& getNullVarRef() noexcept | static const var& getNullVarRef() noexcept | ||||
| { | { | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| return var::null; | |||||
| #else | |||||
| static var nullVar; | static var nullVar; | ||||
| return nullVar; | return nullVar; | ||||
| #endif | |||||
| } | } | ||||
| const var& NamedValueSet::operator[] (const Identifier& name) const noexcept | const var& NamedValueSet::operator[] (const Identifier& name) const noexcept | ||||
| @@ -64,11 +64,6 @@ public: | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~var() noexcept; | ~var() noexcept; | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** A static var object that can be used where you need an empty variant object. */ | |||||
| static const var null; | |||||
| #endif | |||||
| var (const var& valueToCopy); | var (const var& valueToCopy); | ||||
| var (int value) noexcept; | var (int value) noexcept; | ||||
| var (int64 value) noexcept; | var (int64 value) noexcept; | ||||
| @@ -277,6 +272,18 @@ public: | |||||
| */ | */ | ||||
| static var readFromStream (InputStream& input); | static var readFromStream (InputStream& input); | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** This was a static empty var object, but is now deprecated as it's too easy to accidentally | |||||
| use it indirectly during a static constructor, leading to hard-to-find order-of-initialisation | |||||
| problems. | |||||
| @deprecated If you need a default-constructed var, just use var() or {}. | |||||
| The only time you might miss having var::null available might be if you need to return an | |||||
| empty var from a function by reference, but if you need to do that, it's easy enough to use | |||||
| a function-local static var and return that, avoiding any order-of-initialisation issues. | |||||
| */ | |||||
| static const var null; | |||||
| #endif | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| class VariantType; friend class VariantType; | class VariantType; friend class VariantType; | ||||
| @@ -87,15 +87,6 @@ public: | |||||
| /** Move assignment operator */ | /** Move assignment operator */ | ||||
| File& operator= (File&&) noexcept; | File& operator= (File&&) noexcept; | ||||
| //============================================================================== | |||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** This static constant is used for referring to an 'invalid' file. | |||||
| Bear in mind that you should avoid this kind of static variable, and always prefer | |||||
| to use File() or {} if you need a default-constructed File object. | |||||
| */ | |||||
| static const File nonexistent; | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Checks whether the file actually exists. | /** Checks whether the file actually exists. | ||||
| @@ -1037,6 +1028,16 @@ public: | |||||
| JUCE_DEPRECATED (static const StringRef separatorString); | JUCE_DEPRECATED (static const StringRef separatorString); | ||||
| #endif | #endif | ||||
| //============================================================================== | |||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** This was a static empty File object, but is now deprecated as it's too easy to accidentally | |||||
| use it indirectly during a static constructor, leading to hard-to-find order-of-initialisation | |||||
| problems. | |||||
| @deprecated If you need a default-constructed File object, just use File() or {}. | |||||
| */ | |||||
| static const File nonexistent; | |||||
| #endif | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| String fullPath; | String fullPath; | ||||
| @@ -138,17 +138,6 @@ public: | |||||
| /** Destructor. */ | /** Destructor. */ | ||||
| ~String() noexcept; | ~String() noexcept; | ||||
| //============================================================================== | |||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** This is a static empty string object that can be used if you need a reference to one. | |||||
| The value of String::empty is exactly the same as String(), and in almost all cases | |||||
| it's better to avoid String::empty and just use String() or {} instead, so that the compiler | |||||
| only has to reason about locally-constructed objects, rather than taking into account | |||||
| the fact that you're referencing a global shared static memory address. | |||||
| */ | |||||
| static const String empty; | |||||
| #endif | |||||
| /** This is the character encoding type used internally to store the string. | /** This is the character encoding type used internally to store the string. | ||||
| By setting the value of JUCE_STRING_UTF_TYPE to 8, 16, or 32, you can change the | By setting the value of JUCE_STRING_UTF_TYPE to 8, 16, or 32, you can change the | ||||
| @@ -1247,6 +1236,19 @@ public: | |||||
| */ | */ | ||||
| int getReferenceCount() const noexcept; | int getReferenceCount() const noexcept; | ||||
| //============================================================================== | |||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** This was a static empty string object, but is now deprecated as it's too easy to accidentally | |||||
| use it indirectly during a static constructor, leading to hard-to-find order-of-initialisation | |||||
| problems. | |||||
| @deprecated If you need an empty String object, just use String() or {}. | |||||
| The only time you might miss having String::empty available might be if you need to return an | |||||
| empty string from a function by reference, but if you need to do that, it's easy enough to use | |||||
| a function-local static String object and return that, avoiding any order-of-initialisation issues. | |||||
| */ | |||||
| static const String empty; | |||||
| #endif | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| CharPointerType text; | CharPointerType text; | ||||
| @@ -120,12 +120,8 @@ const String& StringArray::operator[] (int index) const noexcept | |||||
| if (isPositiveAndBelow (index, strings.size())) | if (isPositiveAndBelow (index, strings.size())) | ||||
| return strings.getReference (index); | return strings.getReference (index); | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| return String::empty; | |||||
| #else | |||||
| static String empty; | static String empty; | ||||
| return empty; | return empty; | ||||
| #endif | |||||
| } | } | ||||
| String& StringArray::getReference (int index) noexcept | String& StringArray::getReference (int index) noexcept | ||||
| @@ -447,12 +447,8 @@ int XmlElement::getNumAttributes() const noexcept | |||||
| static const String& getEmptyStringRef() noexcept | static const String& getEmptyStringRef() noexcept | ||||
| { | { | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| return String::empty; | |||||
| #else | |||||
| static String empty; | static String empty; | ||||
| return empty; | return empty; | ||||
| #endif | |||||
| } | } | ||||
| const String& XmlElement::getAttributeName (const int index) const noexcept | const String& XmlElement::getAttributeName (const int index) const noexcept | ||||
| @@ -688,12 +688,8 @@ ValueTree ValueTree::getSibling (int delta) const noexcept | |||||
| static const var& getNullVarRef() noexcept | static const var& getNullVarRef() noexcept | ||||
| { | { | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| return var::null; | |||||
| #else | |||||
| static var nullVar; | static var nullVar; | ||||
| return nullVar; | return nullVar; | ||||
| #endif | |||||
| } | } | ||||
| const var& ValueTree::operator[] (const Identifier& name) const noexcept | const var& ValueTree::operator[] (const Identifier& name) const noexcept | ||||
| @@ -532,19 +532,18 @@ public: | |||||
| } | } | ||||
| } | } | ||||
| /** Returns the total number of references to the shared underlying data structure that this | |||||
| ValueTree is using. | |||||
| */ | |||||
| int getReferenceCount() const noexcept; | |||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | #if JUCE_ALLOW_STATIC_NULL_VARIABLES | ||||
| /** An invalid ValueTree that can be used if you need to return one as an error condition, etc. | /** An invalid ValueTree that can be used if you need to return one as an error condition, etc. | ||||
| This invalid object is equivalent to ValueTree created with its default constructor, but | |||||
| you should always prefer to avoid it and use ValueTree() or {} instead. | |||||
| @deprecated If you need an empty ValueTree object, just use ValueTree() or {}. | |||||
| */ | */ | ||||
| static const ValueTree invalid; | static const ValueTree invalid; | ||||
| #endif | #endif | ||||
| /** Returns the total number of references to the shared underlying data structure that this | |||||
| ValueTree is using. | |||||
| */ | |||||
| int getReferenceCount() const noexcept; | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| JUCE_PUBLIC_IN_DLL_BUILD (class SharedObject) | JUCE_PUBLIC_IN_DLL_BUILD (class SharedObject) | ||||
| @@ -68,20 +68,12 @@ public: | |||||
| /** Compares two transforms. */ | /** Compares two transforms. */ | ||||
| bool operator!= (const AffineTransform& other) const noexcept; | bool operator!= (const AffineTransform& other) const noexcept; | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** A ready-to-use identity transform. | |||||
| Note that you should always avoid using a static variable like this, and | |||||
| prefer AffineTransform() or {} if you need a default-constructed instance. | |||||
| */ | |||||
| static const AffineTransform identity; | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Transforms a 2D coordinate using this matrix. */ | /** Transforms a 2D coordinate using this matrix. */ | ||||
| template <typename ValueType> | template <typename ValueType> | ||||
| void transformPoint (ValueType& x, ValueType& y) const noexcept | void transformPoint (ValueType& x, ValueType& y) const noexcept | ||||
| { | { | ||||
| const ValueType oldX = x; | |||||
| auto oldX = x; | |||||
| x = static_cast<ValueType> (mat00 * oldX + mat01 * y + mat02); | x = static_cast<ValueType> (mat00 * oldX + mat01 * y + mat02); | ||||
| y = static_cast<ValueType> (mat10 * oldX + mat11 * y + mat12); | y = static_cast<ValueType> (mat10 * oldX + mat11 * y + mat12); | ||||
| } | } | ||||
| @@ -95,7 +87,7 @@ public: | |||||
| void transformPoints (ValueType& x1, ValueType& y1, | void transformPoints (ValueType& x1, ValueType& y1, | ||||
| ValueType& x2, ValueType& y2) const noexcept | ValueType& x2, ValueType& y2) const noexcept | ||||
| { | { | ||||
| const ValueType oldX1 = x1, oldX2 = x2; | |||||
| auto oldX1 = x1, oldX2 = x2; | |||||
| x1 = static_cast<ValueType> (mat00 * oldX1 + mat01 * y1 + mat02); | x1 = static_cast<ValueType> (mat00 * oldX1 + mat01 * y1 + mat02); | ||||
| y1 = static_cast<ValueType> (mat10 * oldX1 + mat11 * y1 + mat12); | y1 = static_cast<ValueType> (mat10 * oldX1 + mat11 * y1 + mat12); | ||||
| x2 = static_cast<ValueType> (mat00 * oldX2 + mat01 * y2 + mat02); | x2 = static_cast<ValueType> (mat00 * oldX2 + mat01 * y2 + mat02); | ||||
| @@ -112,7 +104,7 @@ public: | |||||
| ValueType& x2, ValueType& y2, | ValueType& x2, ValueType& y2, | ||||
| ValueType& x3, ValueType& y3) const noexcept | ValueType& x3, ValueType& y3) const noexcept | ||||
| { | { | ||||
| const ValueType oldX1 = x1, oldX2 = x2, oldX3 = x3; | |||||
| auto oldX1 = x1, oldX2 = x2, oldX3 = x3; | |||||
| x1 = static_cast<ValueType> (mat00 * oldX1 + mat01 * y1 + mat02); | x1 = static_cast<ValueType> (mat00 * oldX1 + mat01 * y1 + mat02); | ||||
| y1 = static_cast<ValueType> (mat10 * oldX1 + mat11 * y1 + mat12); | y1 = static_cast<ValueType> (mat10 * oldX1 + mat11 * y1 + mat12); | ||||
| x2 = static_cast<ValueType> (mat00 * oldX2 + mat01 * y2 + mat02); | x2 = static_cast<ValueType> (mat00 * oldX2 + mat01 * y2 + mat02); | ||||
| @@ -276,6 +268,13 @@ public: | |||||
| */ | */ | ||||
| float getScaleFactor() const noexcept; | float getScaleFactor() const noexcept; | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** A ready-to-use identity transform - now depracated. | |||||
| @deprecated If you need an identity transform, just use AffineTransform() or {}. | |||||
| */ | |||||
| static const AffineTransform identity; | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /* The transform matrix is: | /* The transform matrix is: | ||||
| @@ -153,14 +153,6 @@ public: | |||||
| */ | */ | ||||
| inline bool isNull() const noexcept { return image == nullptr; } | inline bool isNull() const noexcept { return image == nullptr; } | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** A null Image object that can be used when you need to return an invalid image. | |||||
| This object is the equivalient to an Image created with the default constructor, and | |||||
| you should always prefer to use Image() or {} when you need an empty image object. | |||||
| */ | |||||
| static const Image null; | |||||
| #endif | |||||
| //============================================================================== | //============================================================================== | ||||
| /** Returns the image's width (in pixels). */ | /** Returns the image's width (in pixels). */ | ||||
| int getWidth() const noexcept; | int getWidth() const noexcept; | ||||
| @@ -420,6 +412,13 @@ public: | |||||
| /** @internal */ | /** @internal */ | ||||
| explicit Image (ImagePixelData*) noexcept; | explicit Image (ImagePixelData*) noexcept; | ||||
| #if JUCE_ALLOW_STATIC_NULL_VARIABLES | |||||
| /** A null Image object that can be used when you need to return an invalid image. | |||||
| @deprecated If you need a default-constructed var, just use Image() or {}. | |||||
| */ | |||||
| static const Image null; | |||||
| #endif | |||||
| private: | private: | ||||
| //============================================================================== | //============================================================================== | ||||
| ReferenceCountedObjectPtr<ImagePixelData> image; | ReferenceCountedObjectPtr<ImagePixelData> image; | ||||
| @@ -117,8 +117,6 @@ namespace juce | |||||
| class MouseInputSource; | class MouseInputSource; | ||||
| class MouseInputSourceInternal; | class MouseInputSourceInternal; | ||||
| class ComponentPeer; | class ComponentPeer; | ||||
| class MarkerList; | |||||
| class RelativeRectangle; | |||||
| class MouseEvent; | class MouseEvent; | ||||
| struct MouseWheelDetails; | struct MouseWheelDetails; | ||||
| struct PenDetails; | struct PenDetails; | ||||
| @@ -130,28 +128,21 @@ namespace juce | |||||
| class ComboBox; | class ComboBox; | ||||
| class Button; | class Button; | ||||
| class FilenameComponent; | class FilenameComponent; | ||||
| class DocumentWindow; | |||||
| class ResizableWindow; | class ResizableWindow; | ||||
| class GroupComponent; | |||||
| class MenuBarComponent; | class MenuBarComponent; | ||||
| class DropShadower; | |||||
| class GlyphArrangement; | class GlyphArrangement; | ||||
| class PropertyComponent; | |||||
| class TableHeaderComponent; | class TableHeaderComponent; | ||||
| class Toolbar; | class Toolbar; | ||||
| class ToolbarItemComponent; | |||||
| class PopupMenu; | class PopupMenu; | ||||
| class ProgressBar; | class ProgressBar; | ||||
| class FileBrowserComponent; | class FileBrowserComponent; | ||||
| class DirectoryContentsDisplayComponent; | class DirectoryContentsDisplayComponent; | ||||
| class FilePreviewComponent; | class FilePreviewComponent; | ||||
| class ImageButton; | |||||
| class CallOutBox; | class CallOutBox; | ||||
| class Drawable; | class Drawable; | ||||
| class DrawablePath; | class DrawablePath; | ||||
| class DrawableComposite; | class DrawableComposite; | ||||
| class CaretComponent; | class CaretComponent; | ||||
| class BubbleComponent; | |||||
| class KeyPressMappingSet; | class KeyPressMappingSet; | ||||
| class ApplicationCommandManagerListener; | class ApplicationCommandManagerListener; | ||||
| class DrawableButton; | class DrawableButton; | ||||