diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index f4f2655e43..b37dce3358 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -963,6 +963,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
@@ -3033,6 +3035,8 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
diff --git a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
index 9331410556..e9a00767b8 100644
--- a/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
+++ b/examples/DemoRunner/Builds/MacOSX/DemoRunner.xcodeproj/project.pbxproj
@@ -576,6 +576,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -585,7 +586,7 @@
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
@@ -668,6 +669,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -676,7 +678,7 @@
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
index 2874be55e8..740980086b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
@@ -1244,6 +1244,9 @@
true
+
+ true
+
true
@@ -3305,6 +3308,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
index ef2ec21dfc..05e8c69bc7 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
@@ -1861,6 +1861,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -5115,6 +5118,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index f57ec587d4..5bca301937 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -1244,6 +1244,9 @@
true
+
+ true
+
true
@@ -3305,6 +3308,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index f0f327f78d..bbe9e4d3bd 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -1861,6 +1861,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -5115,6 +5118,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index 32dc7ee4c3..9a9d85f9df 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -1244,6 +1244,9 @@
true
+
+ true
+
true
@@ -3305,6 +3308,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 028cc2f0b0..751651b92f 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -1861,6 +1861,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -5115,6 +5118,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
index 78aa478b5d..a44ecf6578 100644
--- a/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
+++ b/examples/DemoRunner/Builds/iOS/DemoRunner.xcodeproj/project.pbxproj
@@ -584,6 +584,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -592,7 +593,7 @@
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
@@ -676,6 +677,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -683,7 +685,7 @@
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 07dbef3a67..fadc56f02e 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -839,6 +839,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
@@ -2609,6 +2611,8 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 99e3a04935..2011ffbc94 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -1084,6 +1084,9 @@
true
+
+ true
+
true
@@ -2861,6 +2864,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index 262013fa02..4de359f466 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -1570,6 +1570,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4395,6 +4398,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index a9bf036114..d9744fc2ea 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -872,6 +872,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
@@ -2795,6 +2797,8 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
diff --git a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
index daae6d73e3..3dbeca4341 100644
--- a/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
+++ b/extras/AudioPluginHost/Builds/MacOSX/AudioPluginHost.xcodeproj/project.pbxproj
@@ -508,6 +508,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -517,7 +518,7 @@
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
@@ -647,6 +648,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -655,7 +657,7 @@
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
index 8070697ac7..78bbd48ce2 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
@@ -1092,6 +1092,9 @@
true
+
+ true
+
true
@@ -3041,6 +3044,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
index 498a8000c7..92576361e7 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
@@ -1645,6 +1645,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4671,6 +4674,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index d41d5f14a1..d440c2415f 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -1092,6 +1092,9 @@
true
+
+ true
+
true
@@ -3041,6 +3044,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 32e76ecec8..b643e21287 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -1645,6 +1645,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4671,6 +4674,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index e56426d765..2de62435dd 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -1092,6 +1092,9 @@
true
+
+ true
+
true
@@ -3041,6 +3044,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 2db94899e5..15ccebaa3d 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -1645,6 +1645,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4671,6 +4674,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
index 3ec41051a5..0e3f4561ed 100644
--- a/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
+++ b/extras/AudioPluginHost/Builds/iOS/AudioPluginHost.xcodeproj/project.pbxproj
@@ -523,6 +523,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -531,7 +532,7 @@
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
LLVM_LTO = YES;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
@@ -664,6 +665,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -671,7 +673,7 @@
INFOPLIST_FILE = Info-App.plist;
INFOPLIST_PREPROCESS = NO;
INSTALL_PATH = "$(HOME)/Applications";
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
index 6b79c75a32..48edf199d4 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
+++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj
@@ -151,6 +151,9 @@
true
+
+ true
+
true
@@ -501,6 +504,7 @@
+
diff --git a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
index fdf6eac31a..66ba5850dd 100644
--- a/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
+++ b/extras/BinaryBuilder/Builds/VisualStudio2022/BinaryBuilder_ConsoleApp.vcxproj.filters
@@ -91,6 +91,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -477,6 +480,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index c519748689..a41825469d 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -843,6 +843,8 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
@@ -2693,6 +2695,8 @@ set_source_files_properties(
"../../../../../modules/juce_core/containers/juce_DynamicObject.cpp"
"../../../../../modules/juce_core/containers/juce_DynamicObject.h"
"../../../../../modules/juce_core/containers/juce_ElementComparator.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate.h"
+ "../../../../../modules/juce_core/containers/juce_Enumerate_test.cpp"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction.h"
"../../../../../modules/juce_core/containers/juce_FixedSizeFunction_test.cpp"
"../../../../../modules/juce_core/containers/juce_HashMap.h"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index c2bfbe78ec..1b4a9df8ee 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -1084,6 +1084,9 @@
true
+
+ true
+
true
@@ -2952,6 +2955,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 4ccc63dce9..710abcb7fe 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -1600,6 +1600,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4536,6 +4539,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
index fea6188584..5a56d77b8b 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
@@ -287,6 +287,9 @@
true
+
+ true
+
true
@@ -1794,6 +1797,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
index 48e1615653..513c8b25ea 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
@@ -568,6 +568,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -2550,6 +2553,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index b5af8da93d..1f99f50842 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -287,6 +287,9 @@
true
+
+ true
+
true
@@ -1794,6 +1797,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index 704ee39dd6..36caca4c5a 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -568,6 +568,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -2550,6 +2553,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
index 079b40fddb..d6ba24ebe2 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
@@ -287,6 +287,9 @@
true
+
+ true
+
true
@@ -1794,6 +1797,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index c3a0d636e0..00226c4b21 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -568,6 +568,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -2550,6 +2553,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
index b85ce177af..b4dd3cd71e 100644
--- a/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
+++ b/extras/UnitTestRunner/Builds/MacOSX/UnitTestRunner.xcodeproj/project.pbxproj
@@ -449,6 +449,7 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
@@ -456,7 +457,7 @@
INSTALL_PATH = "/usr/bin";
LLVM_LTO = YES;
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
@@ -580,13 +581,14 @@
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK",
"$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK",
+ "$(HOME)/Developer/VSTSDK",
"$(SRCROOT)/../../JuceLibraryCode",
"$(SRCROOT)/../../../../modules",
"$(inherited)",
);
INSTALL_PATH = "/usr/bin";
MACOSX_DEPLOYMENT_TARGET = 10.13;
- MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
+ MTL_HEADER_SEARCH_PATHS = "$(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lilv $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sratom $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord/src $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/sord $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/serd $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK/lv2 $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/LV2_SDK $(SRCROOT)/../../../../modules/juce_audio_processors/format_types/VST3_SDK $(HOME)/Developer/VSTSDK $(SRCROOT)/../../JuceLibraryCode $(SRCROOT)/../../../../modules";
OTHER_CFLAGS = "-Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_CPLUSPLUSFLAGS = "-Woverloaded-virtual -Wreorder -Wzero-as-null-pointer-constant -Wunused-private-field -Winconsistent-missing-destructor-override -Wall -Wcast-align -Wfloat-equal -Wno-ignored-qualifiers -Wsign-compare -Wsign-conversion -Wstrict-aliasing -Wswitch-enum -Wuninitialized -Wunreachable-code -Wunused-parameter -Wmissing-field-initializers -Wshadow-all -Wshorten-64-to-32 -Wconversion -Wint-conversion -Wconditional-uninitialized -Wconstant-conversion -Wbool-conversion -Wextra-semi -Wshift-sign-overflow -Wmissing-prototypes -Wnullable-to-nonnull-conversion -Wpedantic -Wdeprecated -Wunguarded-availability -Wunguarded-availability-new";
OTHER_LDFLAGS = "-Wl,-weak_reference_mismatches,weak";
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
index 353aa1984b..8820b91f52 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
@@ -1100,6 +1100,9 @@
true
+
+ true
+
true
@@ -3097,6 +3100,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
index d9cfeb2ae9..72f760eabd 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1657,6 +1657,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4734,6 +4737,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index ab94849e62..3ad17aeea1 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -1100,6 +1100,9 @@
true
+
+ true
+
true
@@ -3097,6 +3100,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 2214570d64..86023113e1 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1657,6 +1657,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4734,6 +4737,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index ba14e72284..69c25cb54f 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -1100,6 +1100,9 @@
true
+
+ true
+
true
@@ -3097,6 +3100,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index ddb61d6a52..5db23b33be 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -1657,6 +1657,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4734,6 +4737,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
index 463a957040..689590a844 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
@@ -1083,6 +1083,9 @@
true
+
+ true
+
true
@@ -2928,6 +2931,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
index dded486675..4f71f79c7c 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
@@ -1597,6 +1597,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
@@ -4503,6 +4506,9 @@
JUCE Modules\juce_core\containers
+
+ JUCE Modules\juce_core\containers
+
JUCE Modules\juce_core\containers
diff --git a/modules/juce_core/containers/juce_Enumerate.h b/modules/juce_core/containers/juce_Enumerate.h
new file mode 100644
index 0000000000..1108e881f0
--- /dev/null
+++ b/modules/juce_core/containers/juce_Enumerate.h
@@ -0,0 +1,426 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ 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
+{
+
+namespace detail
+{
+
+template
+constexpr auto canPreDecrement = false;
+
+template
+constexpr auto canPreDecrement())>> = true;
+
+template
+constexpr auto canAddAssign = false;
+
+template
+constexpr auto canAddAssign() += std::declval())>> = true;
+
+template
+constexpr auto canSubAssign = false;
+
+template
+constexpr auto canSubAssign() -= std::declval())>> = true;
+
+template
+constexpr auto canAdd = false;
+
+template
+constexpr auto canAdd() + std::declval())>> = true;
+
+template
+constexpr auto canSub = false;
+
+template
+constexpr auto canSub() - std::declval())>> = true;
+
+template
+constexpr auto canLessThan = false;
+
+template
+constexpr auto canLessThan() < std::declval())>> = true;
+
+template
+constexpr auto canLessThanEqual = false;
+
+template
+constexpr auto canLessThanEqual() <= std::declval())>> = true;
+
+template
+constexpr auto canGreaterThan = false;
+
+template
+constexpr auto canGreaterThan() > std::declval())>> = true;
+
+template
+constexpr auto canGreaterThanEqual = false;
+
+template
+constexpr auto canGreaterThanEqual() >= std::declval())>> = true;
+
+namespace withAdlSize
+{
+ using std::size;
+
+ template
+ using AdlSize = decltype (size (std::declval()));
+
+ template
+ using AdlSignedSize = std::common_type_t>>;
+}
+
+} // namespace detail
+
+/**
+ Returned when dereferencing an EnumerateIterator.
+
+ Allows querying the index associated with an element, along with a reference to the element
+ itself.
+
+ You should never need to construct an instance of this type yourself. Instead, use the
+ enumerate() function to construct a range that can be enumerated.
+
+ @see enumerate()
+ @tags{Core}
+*/
+template
+struct Enumerated
+{
+ Index index;
+ Value value;
+};
+
+/**
+ An iterator that wraps some other iterator, keeping track of the relative position of that
+ iterator based on calls to arithmetic operators such as
+ operator++(), operator--(), operator+(), and operator-().
+
+ You should never need to construct an instance of this type yourself. Instead, use the
+ enumerate() function to construct a range that can be enumerated.
+
+ @see enumerate()
+ @tags{Core}
+*/
+template
+class EnumerateIterator
+{
+public:
+ /** Default constructor. */
+ constexpr EnumerateIterator() = default;
+
+ /** Wraps the provided iterator, and sets the internal count to 0. */
+ constexpr explicit EnumerateIterator (Iter iter)
+ : EnumerateIterator (std::move (iter), Index{}) {}
+
+ /** Wraps the provided iterator, and sets the internal count to the provided value. */
+ constexpr EnumerateIterator (Iter iter, Index ind)
+ : iterator (std::move (iter)), index (ind) {}
+
+ /** Two EnumerateIterators are considered equal if the wrapped iterators are equal. */
+ template
+ [[nodiscard]] constexpr bool operator== (const EnumerateIterator& other) const
+ {
+ return iterator == other.iterator;
+ }
+
+ /** @see operator==() */
+ template
+ [[nodiscard]] constexpr bool operator!= (const EnumerateIterator& other) const
+ {
+ return ! operator== (other);
+ }
+
+ /** Dereferencing the iterator produces an Enumerated instance *by value*. This type holds
+ a copy of the iterator's current index, along with the result of dereferencing the
+ wrapped iterator (normally a reference type).
+ */
+ [[nodiscard]] constexpr Enumerated())> operator*() const
+ {
+ return { index, *iterator };
+ }
+
+ /** Increments the iterator and the index. */
+ constexpr EnumerateIterator& operator++()
+ {
+ ++iterator;
+ ++index;
+ return *this;
+ }
+
+ /** Increments the iterator and the index. */
+ constexpr EnumerateIterator operator++ (int)
+ {
+ auto copy = *this;
+ operator++();
+ return copy;
+ }
+
+ /** Decrements the iterator and the index.
+ Only participates in overload resolution if the iterator can be pre-decremented.
+ */
+ template , int> = 0>
+ constexpr EnumerateIterator& operator--()
+ {
+ --iterator;
+ --index;
+ return *this;
+ }
+
+ /** Decrements the iterator and the index.
+ Only participates in overload resolution if the iterator can be pre-decremented.
+ */
+ template , int> = 0>
+ constexpr EnumerateIterator operator-- (int)
+ {
+ auto copy = *this;
+ operator--();
+ return copy;
+ }
+
+ /** Adds an integral value to both the iterator and the index.
+ Only participates in overload resolution if the iterator can be add-assigned.
+ */
+ template , int> = 0>
+ constexpr EnumerateIterator& operator+= (I diff)
+ {
+ iterator += diff;
+ index += static_cast (diff);
+ return *this;
+ }
+
+ /** Subtracts an integral value from both the iterator and the index.
+ Only participates in overload resolution if the iterator can be sub-assigned.
+ */
+ template , int> = 0>
+ constexpr EnumerateIterator& operator-= (I diff)
+ {
+ iterator -= diff;
+ index -= static_cast (diff);
+ return *this;
+ }
+
+ /** Subtracts another enumerate iterator from this one, producing the same result as
+ subtracting the two wrapped iterators. For random-access iterators, this will normally
+ return the distance between the two iterators.
+ Only participates in overload resolution if the wrapped iterators can be subtracted.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr auto operator- (const EnumerateIterator& other) const
+ {
+ return iterator - other.iterator;
+ }
+
+ /** Indexes into this iterator, equivalent to adding an integral value to this iterator and
+ then dereferencing the result.
+ Only participates in overload resolution if the wrapped iterator allows addition of
+ integral values.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr auto operator[] (I diff) const
+ {
+ return *(*this + diff);
+ }
+
+ /** Returns the result of comparing the two wrapped iterators.
+ Only participates in overload resolution if the wrapped iterators are comparable.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr bool operator< (const EnumerateIterator& other) const
+ {
+ return iterator < other.iterator;
+ }
+
+ /** Returns the result of comparing the two wrapped iterators.
+ Only participates in overload resolution if the wrapped iterators are comparable.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr bool operator<= (const EnumerateIterator& other) const
+ {
+ return iterator <= other.iterator;
+ }
+
+ /** Returns the result of comparing the two wrapped iterators.
+ Only participates in overload resolution if the wrapped iterators are comparable.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr bool operator> (const EnumerateIterator& other) const
+ {
+ return iterator > other.iterator;
+ }
+
+ /** Returns the result of comparing the two wrapped iterators.
+ Only participates in overload resolution if the wrapped iterators are comparable.
+ */
+ template , int> = 0>
+ [[nodiscard]] constexpr bool operator>= (const EnumerateIterator& other) const
+ {
+ return iterator >= other.iterator;
+ }
+
+ /** Returns the result of adding an integral value to this iterator.
+ Only participates in overload resolution if addition is supported by the wrapped iterator.
+ */
+ template , int> = 0>
+ constexpr friend auto operator+ (EnumerateIterator iter, I ind)
+ {
+ return iter += ind;
+ }
+
+ /** Returns the result of adding an integral value to this iterator.
+ Only participates in overload resolution if addition is supported by the wrapped iterator.
+ */
+ template , int> = 0>
+ constexpr friend auto operator+ (I ind, EnumerateIterator iter)
+ {
+ return iter += ind;
+ }
+
+ /** Returns the result of subtracting an integral value from this iterator.
+ Only participates in overload resolution if subtraction is supported by the wrapped iterator.
+ */
+ template , int> = 0>
+ constexpr friend auto operator- (EnumerateIterator iter, I ind)
+ {
+ return iter -= ind;
+ }
+
+private:
+ Iter iterator{};
+ Index index = 0;
+};
+
+//==============================================================================
+/**
+ Wraps a pair of iterators, providing member begin() and end() functions that return
+ those iterators.
+ This is useful in situations where you have an iterator pair, but want to use that
+ pair somewhere that requires an iterable range, such as in a ranged-for loop.
+
+ @see makeRange()
+*/
+template
+class IteratorPair
+{
+public:
+ /** Constructs a pair from a begin and end iterator.
+ Instead of calling this directly, use makeRange().
+ */
+ constexpr IteratorPair (Begin bIn, End eIn)
+ : b (std::move (bIn)), e (std::move (eIn)) {}
+
+ /** Returns the begin iterator. */
+ constexpr auto begin() const { return b; }
+
+ /** Returns the end iterator. */
+ constexpr auto end() const { return e; }
+
+private:
+ Begin b;
+ End e;
+};
+
+/**
+ Given two iterators "begin" and "end", returns an IteratorPair with a member
+ begin() and end() function. This pair can be used in contexts that expect an
+ iterable range, the most significant of which is ranged-for loops.
+ This automatically deduces the Begin and End types, so it is more concise to use than
+ directly calling the IteratorPair constructor.
+*/
+template
+[[nodiscard]] constexpr auto makeRange (Begin begin, End end)
+{
+ return IteratorPair { std::move (begin), std::move (end) };
+}
+
+//==============================================================================
+/**
+ Given a range and an optional starting offset, returns an IteratorPair that
+ holds EnumerateIterators wrapping the begin() and end() of the range.
+
+ This is useful in situations where you need to iterate some range, but also query
+ the position of each item in the range.
+
+ A simple usage might look like this:
+
+ @code
+ std::list elements { 10, 20, 30, 40, 50 };
+
+ for (const auto pair : enumerate (elements))
+ std::cout << pair.index << ' ' << pair.value << ' ';
+
+ // output: 0 10 1 20 2 30 3 40 4 50
+ @endcode
+
+ You can also use structured bindings to concisely destructure each Enumerated instance:
+
+ @code
+ for (const auto [index, value] : enumerate (elements))
+ std::cout << index << ' ' << value << ' ';
+ @endcode
+
+ Note that the Enumerated instance is returned by value. This is because each Enumerated
+ instance is created on-demand when the iterator is dereferenced. As a result, the following
+ will result in a dangling reference, and will probably trigger a compiler warning:
+
+ @code
+ // BAD IDEA: creating a reference to a temporary Enumerated instance
+ for (auto& [index, value] : enumerate (elements))
+ ...
+ @endcode
+
+ The 'value' member of Enumerated automatically assumes the same type as dereferencing the
+ wrapped iterator, which is normally a reference to an element of a container.
+ In the following snippet, the type of '[index, value]' is 'const Enumerated',
+ the type of 'index' is 'ptrdiff_t', and the type of 'value' is 'int&'.
+
+ @code
+ std::vector elements { 10, 20, 30, 40, 50 };
+ for (const auto [index, value] : enumerate (elements))
+ ...
+ @endcode
+
+ By default, the constness of pair.value will match the constness of the range passed to
+ enumerate. If you pass a mutable lvalue reference to enumerate, then each value will also
+ be mutable. If you pass a constant lvalue reference to enumerate, then each value will be
+ const. If you know that you don't need the iterated elements to be mutable, it's good
+ practice to wrap the range with std::as_const before passing it to enumerate:
+
+ @code
+ for (const auto [index, value] : enumerate (std::as_const (elements)))
+ {
+ // value is immutable here
+ }
+ @endcode
+*/
+template >
+[[nodiscard]] constexpr auto enumerate (Range&& range, Index startingValue = {})
+{
+ // This ensures argument-dependent lookup works properly for user-defined non-member begin/end
+ using std::begin, std::end;
+ return makeRange (EnumerateIterator { begin (range), startingValue },
+ EnumerateIterator { end (range), startingValue });
+}
+
+} // namespace juce
diff --git a/modules/juce_core/containers/juce_Enumerate_test.cpp b/modules/juce_core/containers/juce_Enumerate_test.cpp
new file mode 100644
index 0000000000..e3ed753b62
--- /dev/null
+++ b/modules/juce_core/containers/juce_Enumerate_test.cpp
@@ -0,0 +1,126 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE library.
+ Copyright (c) 2022 - Raw Material Software Limited
+
+ 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
+{
+
+class EnumerateUnitTest : public UnitTest
+{
+public:
+ EnumerateUnitTest() : UnitTest ("Enumerate", UnitTestCategories::containers) {}
+
+ void runTest() override
+ {
+ beginTest ("enumeration works for bidirectional iterators");
+ {
+ const std::list elements { 10, 20, 30, 40, 50 };
+ std::vector counts;
+
+ for (const auto pair : enumerate (elements))
+ counts.push_back ((int) pair.index);
+
+ expect (counts == std::vector { 0, 1, 2, 3, 4 });
+ }
+
+ beginTest ("enumeration works for random-access iterators");
+ {
+ const std::vector strings { "a", "bb", "ccc", "dddd", "eeeee" };
+
+ std::vector counts;
+
+ for (const auto [count, element] : enumerate (strings))
+ counts.push_back ((int) ((size_t) count + element.size()));
+
+ expect (counts == std::vector { 1, 3, 5, 7, 9 });
+ }
+
+ beginTest ("enumeration works for mutable ranges");
+ {
+ std::vector strings { "", "", "", "", "" };
+
+ for (const auto [count, element] : enumerate (strings))
+ element = std::to_string (count);
+
+ expect (strings == std::vector { "0", "1", "2", "3", "4" });
+ }
+
+ beginTest ("iterator can be incremented by more than one");
+ {
+ std::vector ints (6);
+
+ const auto enumerated = enumerate (ints);
+
+ std::vector counts;
+
+ for (auto b = enumerated.begin(), e = enumerated.end(); b != e; b += 2)
+ counts.push_back ((int) (*b).index);
+
+ expect (counts == std::vector { 0, 2, 4 });
+ }
+
+ beginTest ("iterator can be started at a non-zero value");
+ {
+ const std::vector ints (6);
+
+ std::vector counts;
+
+ for (const auto enumerated : enumerate (ints, 5))
+ counts.push_back ((int) enumerated.index);
+
+ expect (counts == std::vector { 5, 6, 7, 8, 9, 10 });
+ }
+
+ beginTest ("subtracting two EnumerateIterators returns the difference between the base iterators");
+ {
+ const std::vector ints (6);
+ const auto enumerated = enumerate (ints);
+ expect ((int) (enumerated.end() - enumerated.begin()) == (int) ints.size());
+ }
+
+ beginTest ("EnumerateIterator can be decremented");
+ {
+ const std::vector ints (5);
+ std::vector counts;
+
+ const auto enumerated = enumerate (std::as_const (ints));
+
+ for (auto i = enumerated.end(), b = enumerated.begin(); i != b; --i)
+ counts.push_back ((int) (*(i - 1)).index);
+
+ expect (counts == std::vector { -1, -2, -3, -4, -5 });
+ }
+
+ beginTest ("EnumerateIterator can be compared");
+ {
+ const std::vector ints (6);
+ const auto enumerated = enumerate (ints);
+ expect (enumerated.begin() < enumerated.end());
+ expect (enumerated.begin() <= enumerated.end());
+ expect (enumerated.end() > enumerated.begin());
+ expect (enumerated.end() >= enumerated.begin());
+ }
+ }
+};
+
+static EnumerateUnitTest enumerateUnitTest;
+
+} // namespace juce
diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp
index 8a7fa37100..60878dc9c7 100644
--- a/modules/juce_core/juce_core.cpp
+++ b/modules/juce_core/juce_core.cpp
@@ -280,6 +280,7 @@
#if JUCE_UNIT_TESTS
#include "containers/juce_HashMap_test.cpp"
#include "containers/juce_Optional_test.cpp"
+ #include "containers/juce_Enumerate_test.cpp"
#include "maths/juce_MathsFunctions_test.cpp"
#include "misc/juce_EnumHelpers_test.cpp"
#include "containers/juce_FixedSizeFunction_test.cpp"
diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h
index e3e3589d2d..43bf824a63 100644
--- a/modules/juce_core/juce_core.h
+++ b/modules/juce_core/juce_core.h
@@ -246,6 +246,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC
#include "memory/juce_ScopedPointer.h"
#include "memory/juce_OptionalScopedPointer.h"
#include "containers/juce_Optional.h"
+#include "containers/juce_Enumerate.h"
#include "containers/juce_ScopedValueSetter.h"
#include "memory/juce_Singleton.h"
#include "memory/juce_WeakReference.h"