diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt index 2ca24b2b63..02f9c8fd60 100644 --- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt +++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt @@ -687,6 +687,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" "../../../../../modules/juce_core/files/juce_FileSearchPath.h" "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" "../../../../../modules/juce_core/files/juce_TemporaryFile.h" "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" @@ -2293,6 +2295,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj index 2eb76a30a2..34933e60f0 100644 --- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj @@ -926,6 +926,9 @@ true + + true + true @@ -2615,6 +2618,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters index 81006063ac..54f99e377e 100644 --- a/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2015/DemoRunner_App.vcxproj.filters @@ -1357,6 +1357,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3912,6 +3915,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj index 48e8291b26..9b921f557a 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj @@ -926,6 +926,9 @@ true + + true + true @@ -2615,6 +2618,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters index f9b5f9cb8d..da89dbd840 100644 --- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters @@ -1357,6 +1357,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3912,6 +3915,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj index b4873c703e..44e19ff233 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj @@ -926,6 +926,9 @@ true + + true + true @@ -2615,6 +2618,7 @@ + diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters index 6ee06c3dea..b842c832b8 100644 --- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters +++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters @@ -1357,6 +1357,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3912,6 +3915,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt index 1d1ca5b84b..14a9a5420a 100644 --- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt @@ -526,6 +526,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" "../../../../../modules/juce_core/files/juce_FileSearchPath.h" "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" "../../../../../modules/juce_core/files/juce_TemporaryFile.h" "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" @@ -1816,6 +1818,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj index 7d70bf0e07..5f245bec0d 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj @@ -712,6 +712,9 @@ true + + true + true @@ -2136,6 +2139,7 @@ + diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters index e428d32762..b79dd06477 100644 --- a/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters +++ b/extras/AudioPerformanceTest/Builds/VisualStudio2019/AudioPerformanceTest_App.vcxproj.filters @@ -994,6 +994,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3087,6 +3090,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt index bcb48ae49c..5b2beba4bd 100644 --- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt +++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt @@ -543,6 +543,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" "../../../../../modules/juce_core/files/juce_FileSearchPath.h" "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" "../../../../../modules/juce_core/files/juce_TemporaryFile.h" "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" @@ -1906,6 +1908,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj index 1099144da1..f3db3c2e90 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj @@ -719,6 +719,9 @@ true + + true + true @@ -2212,6 +2215,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters index 1e4b8752e0..faec4a60ff 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2015/AudioPluginHost_App.vcxproj.filters @@ -1051,6 +1051,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3240,6 +3243,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj index db90221a5e..35870f9878 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj @@ -719,6 +719,9 @@ true + + true + true @@ -2212,6 +2215,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters index c787b9c371..d84b6ad583 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters @@ -1051,6 +1051,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3240,6 +3243,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj index b9f3008a2a..1b7a41738f 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj @@ -719,6 +719,9 @@ true + + true + true @@ -2212,6 +2215,7 @@ + diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters index a9b9cd5ba0..ee229dd626 100644 --- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters +++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters @@ -1051,6 +1051,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3240,6 +3243,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj index 6369613695..71bf2fc42f 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj +++ b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj @@ -187,6 +187,9 @@ true + + true + true @@ -469,6 +472,7 @@ + diff --git a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters index 1cb4265e19..9750fee0f0 100644 --- a/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters +++ b/extras/BinaryBuilder/Builds/VisualStudio2019/BinaryBuilder_ConsoleApp.vcxproj.filters @@ -127,6 +127,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -477,6 +480,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt index d6ee01eae3..b42e6bfd63 100644 --- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt +++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt @@ -530,6 +530,8 @@ add_library( ${BINARY_NAME} "../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" "../../../../../modules/juce_core/files/juce_FileSearchPath.h" "../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" + "../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" "../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" "../../../../../modules/juce_core/files/juce_TemporaryFile.h" "../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" @@ -1895,6 +1897,8 @@ set_source_files_properties("../../../../../modules/juce_core/files/juce_FileOut set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_FileSearchPath.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_MemoryMappedFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) +set_source_files_properties("../../../../../modules/juce_core/files/juce_RangedDirectoryIterator.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_TemporaryFile.h" PROPERTIES HEADER_FILE_ONLY TRUE) set_source_files_properties("../../../../../modules/juce_core/files/juce_WildcardFileFilter.cpp" PROPERTIES HEADER_FILE_ONLY TRUE) diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj index 082592e57b..60d80f49ff 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj @@ -712,6 +712,9 @@ true + + true + true @@ -2221,6 +2224,7 @@ + diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters index c1edaf5f75..118807326e 100644 --- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters +++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2019/NetworkGraphicsDemo_App.vcxproj.filters @@ -1024,6 +1024,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3222,6 +3225,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj index 25f923517a..623084444b 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj @@ -328,6 +328,9 @@ true + + true + true @@ -1716,6 +1719,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters index ad63e271d1..7dd92a6dd0 100644 --- a/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2015/Projucer_App.vcxproj.filters @@ -613,6 +613,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2559,6 +2562,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj index 4adbfe2f3a..80abca404c 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj @@ -328,6 +328,9 @@ true + + true + true @@ -1716,6 +1719,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters index e8840a14e9..fde62326ba 100644 --- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters @@ -613,6 +613,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2559,6 +2562,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj index fb1fe9dcd6..e873a766b8 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj @@ -328,6 +328,9 @@ true + + true + true @@ -1716,6 +1719,7 @@ + diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters index bea1bfdaff..ec4b8478e3 100644 --- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters +++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters @@ -613,6 +613,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -2559,6 +2562,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/Projucer/Source/Application/jucer_Application.cpp b/extras/Projucer/Source/Application/jucer_Application.cpp index 3e09a9ec4c..a0624e8492 100644 --- a/extras/Projucer/Source/Application/jucer_Application.cpp +++ b/extras/Projucer/Source/Application/jucer_Application.cpp @@ -638,8 +638,7 @@ Array ProjucerApplication::getSortedExampleDirectories() noexcept if (! isValidJUCEExamplesDirectory (examplesPath)) return {}; - DirectoryIterator iter (examplesPath, false, "*", File::findDirectories); - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (examplesPath, false, "*", File::findDirectories)) { auto exampleDirectory = iter.getFile(); @@ -657,8 +656,7 @@ Array ProjucerApplication::getSortedExampleFilesInDirectory (const File& d { Array exampleFiles; - DirectoryIterator iter (directory, false, "*.h", File::findFiles); - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (directory, false, "*.h", File::findFiles)) exampleFiles.add (iter.getFile()); exampleFiles.sort(); diff --git a/extras/Projucer/Source/Application/jucer_CommandLine.cpp b/extras/Projucer/Source/Application/jucer_CommandLine.cpp index 69a56096af..7fa08b9483 100644 --- a/extras/Projucer/Source/Application/jucer_CommandLine.cpp +++ b/extras/Projucer/Source/Application/jucer_CommandLine.cpp @@ -40,7 +40,7 @@ namespace { Array files; - for (DirectoryIterator di (folder, true, "*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx;*.hpp;*.mm;*.m;*.java;*.dox;*.soul;*.js", File::findFiles); di.next();) + for (const auto& di : RangedDirectoryIterator (folder, true, "*.cpp;*.cxx;*.cc;*.c;*.h;*.hpp;*.hxx;*.hpp;*.mm;*.m;*.java;*.dox;*.soul;*.js", File::findFiles)) if (! di.getFile().isSymbolicLink()) files.add (di.getFile()); @@ -263,9 +263,7 @@ namespace ZipFile::Builder zip; { - DirectoryIterator i (moduleFolder, true, "*", File::findFiles); - - while (i.next()) + for (const auto& i : RangedDirectoryIterator (moduleFolder, true, "*", File::findFiles)) if (! i.getFile().isHidden()) zip.addFile (i.getFile(), 9, i.getFile().getRelativePathFrom (moduleFolderParent)); } @@ -298,10 +296,9 @@ namespace if (buildAllWithIndex) { auto folderToSearch = args[2].resolveAsFile(); - DirectoryIterator i (folderToSearch, false, "*", File::findDirectories); var infoList; - while (i.next()) + for (const auto& i : RangedDirectoryIterator (folderToSearch, false, "*", File::findDirectories)) { LibraryModule module (i.getFile()); diff --git a/extras/Projucer/Source/Project/jucer_Module.cpp b/extras/Projucer/Source/Project/jucer_Module.cpp index 116926944f..d9d398d1bb 100644 --- a/extras/Projucer/Source/Project/jucer_Module.cpp +++ b/extras/Projucer/Source/Project/jucer_Module.cpp @@ -73,7 +73,7 @@ static void addAllModulesInSubfoldersRecursively (const File& path, int depth, A { if (depth > 0) { - for (DirectoryIterator iter (path, false, "*", File::findDirectories); iter.next();) + for (const auto& iter : RangedDirectoryIterator (path, false, "*", File::findDirectories)) { if (auto* job = ThreadPoolJob::getCurrentThreadPoolJob()) if (job->shouldExit()) @@ -415,11 +415,8 @@ void LibraryModule::findBrowseableFiles (const File& folder, Array& filesF Array tempList; FileSorter sorter; - DirectoryIterator iter (folder, true, "*", File::findFiles); - bool isHiddenFile; - - while (iter.next (nullptr, &isHiddenFile, nullptr, nullptr, nullptr, nullptr)) - if (! isHiddenFile && iter.getFile().hasFileExtension (browseableFileExtensions)) + for (const auto& iter : RangedDirectoryIterator (folder, true, "*", File::findFiles)) + if (! iter.isHidden() && iter.getFile().hasFileExtension (browseableFileExtensions)) tempList.addSorted (sorter, iter.getFile()); filesFound.addArray (tempList); diff --git a/extras/Projucer/Source/Project/jucer_Project.cpp b/extras/Projucer/Source/Project/jucer_Project.cpp index 337c72bb12..e676ace124 100644 --- a/extras/Projucer/Source/Project/jucer_Project.cpp +++ b/extras/Projucer/Source/Project/jucer_Project.cpp @@ -1502,7 +1502,7 @@ bool Project::Item::addFileAtIndex (const File& file, int insertIndex, const boo { auto group = addNewSubGroup (file.getFileName(), insertIndex); - for (DirectoryIterator iter (file, false, "*", File::findFilesAndDirectories); iter.next();) + for (const auto& iter : RangedDirectoryIterator (file, false, "*", File::findFilesAndDirectories)) if (! project.getMainGroup().findItemForFile (iter.getFile()).isValid()) group.addFileRetainingSortOrder (iter.getFile(), shouldCompile); } diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h index ad4a95eb81..d474bee71a 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectExport_Xcode.h @@ -2221,9 +2221,9 @@ private: // Delete .rsrc files in folder but don't follow sym-links void deleteRsrcFiles (const File& folder) const { - for (DirectoryIterator di (folder, false, "*", File::findFilesAndDirectories); di.next();) + for (const auto& di : RangedDirectoryIterator (folder, false, "*", File::findFilesAndDirectories)) { - auto& entry = di.getFile(); + const auto& entry = di.getFile(); if (! entry.isSymbolicLink()) { diff --git a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h index a642445bd8..56f1edaad4 100644 --- a/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h +++ b/extras/Projucer/Source/ProjectSaving/jucer_ProjectSaver.h @@ -262,11 +262,9 @@ private: bool deleteUnwantedFilesIn (const File& parent) { bool folderIsNowEmpty = true; - DirectoryIterator i (parent, false, "*", File::findFilesAndDirectories); Array filesToDelete; - bool isFolder; - while (i.next (&isFolder, nullptr, nullptr, nullptr, nullptr, nullptr)) + for (const auto& i : RangedDirectoryIterator (parent, false, "*", File::findFilesAndDirectories)) { auto f = i.getFile(); @@ -274,7 +272,7 @@ private: { folderIsNowEmpty = false; } - else if (isFolder) + else if (i.isDirectory()) { if (deleteUnwantedFilesIn (f)) filesToDelete.add (f); diff --git a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp index 1c1b944a82..951033855c 100644 --- a/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp +++ b/extras/Projucer/Source/Settings/jucer_StoredSettings.cpp @@ -173,8 +173,7 @@ void StoredSettings::updateOldProjectSettingsFiles() auto newProjectSettingsDir = projucerSettingsDirectory.getChildFile ("ProjectSettings"); newProjectSettingsDir.createDirectory(); - DirectoryIterator iter (projucerSettingsDirectory, false, "*.settings"); - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (projucerSettingsDirectory, false, "*.settings")) { auto f = iter.getFile(); auto oldFileName = f.getFileName(); diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp index b9375b5924..c91f90abd1 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp +++ b/extras/Projucer/Source/Utility/Helpers/jucer_FileHelpers.cpp @@ -24,9 +24,7 @@ namespace FileHelpers { bool containsAnyNonHiddenFiles (const File& folder) { - DirectoryIterator di (folder, false); - - while (di.next()) + for (const auto& di : RangedDirectoryIterator (folder, false)) if (! di.getFile().isHidden()) return true; diff --git a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h index c21c174124..b7896404dc 100644 --- a/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h +++ b/extras/Projucer/Source/Utility/Helpers/jucer_TranslationHelpers.h @@ -161,9 +161,9 @@ struct TranslationHelpers static void scanFolderForTranslations (StringArray& strings, const File& root) { - for (DirectoryIterator i (root, true); i.next();) + for (const auto& i : RangedDirectoryIterator (root, true)) { - const auto file (i.getFile()); + const auto file = i.getFile(); if (file.hasFileExtension (sourceOrHeaderFileExtensions)) scanFileForTranslations(strings, file); diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj index f2a742b398..c8d44414ca 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj @@ -782,6 +782,9 @@ true + + true + true @@ -2417,6 +2420,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters index 8aefc52534..5220044812 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -1165,6 +1165,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3558,6 +3561,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj index 2fb33d8c53..7c39f54375 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj @@ -782,6 +782,9 @@ true + + true + true @@ -2417,6 +2420,7 @@ + diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters index 419f6719fb..851af349ea 100644 --- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters +++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters @@ -1165,6 +1165,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3558,6 +3561,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj index e8e27a98da..cb5ff33ac9 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj +++ b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj @@ -711,6 +711,9 @@ true + + true + true @@ -2197,6 +2200,7 @@ + diff --git a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters index de1ce40c47..ab6aa28619 100644 --- a/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters +++ b/extras/WindowsDLL/Builds/VisualStudio2019/WindowsDLL_StaticLibrary.vcxproj.filters @@ -1021,6 +1021,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files @@ -3189,6 +3192,9 @@ JUCE Modules\juce_core\files + + JUCE Modules\juce_core\files + JUCE Modules\juce_core\files diff --git a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp index ec937bfc0f..d65642de67 100644 --- a/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_LADSPAPluginFormat.cpp @@ -683,9 +683,8 @@ StringArray LADSPAPluginFormat::searchPathsForPlugins (const FileSearchPath& dir void LADSPAPluginFormat::recursiveFileSearch (StringArray& results, const File& dir, const bool recursive) { - DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (dir, false, "*", File::findFilesAndDirectories)) { auto f = iter.getFile(); bool isPlugin = false; diff --git a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp index 39fe46519c..5040407dc8 100644 --- a/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VST3PluginFormat.cpp @@ -3175,9 +3175,7 @@ StringArray VST3PluginFormat::searchPathsForPlugins (const FileSearchPath& direc void VST3PluginFormat::recursiveFileSearch (StringArray& results, const File& directory, const bool recursive) { - DirectoryIterator iter (directory, false, "*", File::findFilesAndDirectories); - - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (directory, false, "*", File::findFilesAndDirectories)) { auto f = iter.getFile(); bool isPlugin = false; diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index d268aeb049..a566774517 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -3605,9 +3605,7 @@ void VSTPluginFormat::recursiveFileSearch (StringArray& results, const File& dir { // avoid allowing the dir iterator to be recursive, because we want to avoid letting it delve inside // .component or .vst directories. - DirectoryIterator iter (dir, false, "*", File::findFilesAndDirectories); - - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (dir, false, "*", File::findFilesAndDirectories)) { auto f = iter.getFile(); bool isPlugin = false; diff --git a/modules/juce_core/files/juce_DirectoryIterator.cpp b/modules/juce_core/files/juce_DirectoryIterator.cpp index 487301b767..bd393a4f4e 100644 --- a/modules/juce_core/files/juce_DirectoryIterator.cpp +++ b/modules/juce_core/files/juce_DirectoryIterator.cpp @@ -64,6 +64,9 @@ bool DirectoryIterator::next() return next (nullptr, nullptr, nullptr, nullptr, nullptr, nullptr); } +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) + bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fileSize, Time* modTime, Time* creationTime, bool* isReadOnly) { @@ -134,6 +137,9 @@ bool DirectoryIterator::next (bool* isDirResult, bool* isHiddenResult, int64* fi } } +JUCE_END_IGNORE_WARNINGS_GCC_LIKE +JUCE_END_IGNORE_WARNINGS_MSVC + const File& DirectoryIterator::getFile() const { if (subIterator != nullptr && subIterator->hasBeenAdvanced) diff --git a/modules/juce_core/files/juce_DirectoryIterator.h b/modules/juce_core/files/juce_DirectoryIterator.h index 2ad9d3264a..59b9d604f1 100644 --- a/modules/juce_core/files/juce_DirectoryIterator.h +++ b/modules/juce_core/files/juce_DirectoryIterator.h @@ -25,6 +25,8 @@ namespace juce //============================================================================== /** + This class is now deprecated in favour of RangedDirectoryIterator. + Searches through the files in a directory, returning each file that is found. A DirectoryIterator will search through a directory and its subdirectories using @@ -42,12 +44,15 @@ namespace juce It also provides an estimate of its progress, using a (highly inaccurate!) algorithm. @tags{Core} + @see RangedDirectoryIterator */ class JUCE_API DirectoryIterator final { public: //============================================================================== - /** Creates a DirectoryIterator for a given directory. + /** This class is now deprecated in favour of RangedDirectoryIterator. + + Creates a DirectoryIterator for a given directory. After creating one of these, call its next() method to get the first file - e.g. @code @@ -68,11 +73,12 @@ public: separated by a semi-colon or comma, e.g. "*.jpg;*.png" @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying whether to look for files, directories, or both. + @see RangedDirectoryIterator */ - DirectoryIterator (const File& directory, - bool isRecursive, - const String& wildCard = "*", - int whatToLookFor = File::findFiles); + JUCE_DEPRECATED (DirectoryIterator (const File& directory, + bool isRecursive, + const String& wildCard = "*", + int whatToLookFor = File::findFiles)); /** Destructor. */ ~DirectoryIterator(); diff --git a/modules/juce_core/files/juce_File.cpp b/modules/juce_core/files/juce_File.cpp index a7eab140fc..8f45f8d73a 100644 --- a/modules/juce_core/files/juce_File.cpp +++ b/modules/juce_core/files/juce_File.cpp @@ -574,7 +574,7 @@ int File::findChildFiles (Array& results, int whatToLookFor, bool searchRe { int total = 0; - for (DirectoryIterator di (*this, searchRecursively, wildcard, whatToLookFor); di.next();) + for (const auto& di : RangedDirectoryIterator (*this, searchRecursively, wildcard, whatToLookFor)) { results.add (di.getFile()); ++total; @@ -585,12 +585,10 @@ int File::findChildFiles (Array& results, int whatToLookFor, bool searchRe int File::getNumberOfChildFiles (const int whatToLookFor, const String& wildCardPattern) const { - int total = 0; - - for (DirectoryIterator di (*this, false, wildCardPattern, whatToLookFor); di.next();) - ++total; - - return total; + return std::accumulate (RangedDirectoryIterator (*this, false, wildCardPattern, whatToLookFor), + RangedDirectoryIterator(), + 0, + [] (int acc, const DirectoryEntry&) { return acc + 1; }); } bool File::containsSubDirectories() const @@ -598,8 +596,7 @@ bool File::containsSubDirectories() const if (! isDirectory()) return false; - DirectoryIterator di (*this, false, "*", findDirectories); - return di.next(); + return RangedDirectoryIterator (*this, false, "*", findDirectories) != RangedDirectoryIterator(); } //============================================================================== diff --git a/modules/juce_core/files/juce_File.h b/modules/juce_core/files/juce_File.h index de2e7fdaae..9470a36a5c 100644 --- a/modules/juce_core/files/juce_File.h +++ b/modules/juce_core/files/juce_File.h @@ -574,7 +574,7 @@ public: @param wildCardPattern the filename pattern to search for, e.g. "*.txt" @returns the set of files that were found - @see getNumberOfChildFiles, DirectoryIterator + @see getNumberOfChildFiles, RangedDirectoryIterator */ Array findChildFiles (int whatToLookFor, bool searchRecursively, @@ -602,7 +602,8 @@ public: is also added to this value, hidden files won't be counted @param wildCardPattern the filename pattern to search for, e.g. "*.txt" @returns the number of matches found - @see findChildFiles, DirectoryIterator + + @see findChildFiles, RangedDirectoryIterator */ int getNumberOfChildFiles (int whatToLookFor, const String& wildCardPattern = "*") const; diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.cpp b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp new file mode 100644 index 0000000000..170610c6df --- /dev/null +++ b/modules/juce_core/files/juce_RangedDirectoryIterator.cpp @@ -0,0 +1,68 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2017 - ROLI Ltd. + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +JUCE_BEGIN_IGNORE_WARNINGS_GCC_LIKE ("-Wdeprecated-declarations") +JUCE_BEGIN_IGNORE_WARNINGS_MSVC (4996) + +// We implement this in terms of the deprecated DirectoryIterator, +// but the old DirectoryIterator might go away in the future! +RangedDirectoryIterator::RangedDirectoryIterator (const File& directory, + bool isRecursive, + const String& wildCard, + int whatToLookFor) + : iterator (new DirectoryIterator (directory, + isRecursive, + wildCard, + whatToLookFor)) +{ + increment(); +} + +JUCE_END_IGNORE_WARNINGS_GCC_LIKE +JUCE_END_IGNORE_WARNINGS_MSVC + +bool RangedDirectoryIterator::next() +{ + const auto result = iterator->next (&entry.directory, + &entry.hidden, + &entry.fileSize, + &entry.modTime, + &entry.creationTime, + &entry.readOnly); + if (result) + entry.file = iterator->getFile(); + else + entry = {}; + + return result; +} + +void RangedDirectoryIterator::increment() +{ + if (iterator != nullptr && ! next()) + iterator = nullptr; +} + +} // namespace juce diff --git a/modules/juce_core/files/juce_RangedDirectoryIterator.h b/modules/juce_core/files/juce_RangedDirectoryIterator.h new file mode 100644 index 0000000000..21c78771dd --- /dev/null +++ b/modules/juce_core/files/juce_RangedDirectoryIterator.h @@ -0,0 +1,169 @@ +/* + ============================================================================== + + This file is part of the JUCE library. + Copyright (c) 2017 - ROLI Ltd. + + JUCE is an open source library subject to commercial or open-source + licensing. + + The code included in this file is provided under the terms of the ISC license + http://www.isc.org/downloads/software-support-policy/isc-license. Permission + To use, copy, modify, and/or distribute this software for any purpose with or + without fee is hereby granted provided that the above copyright notice and + this permission notice appear in all copies. + + JUCE IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL WARRANTIES, WHETHER + EXPRESSED OR IMPLIED, INCLUDING MERCHANTABILITY AND FITNESS FOR PURPOSE, ARE + DISCLAIMED. + + ============================================================================== +*/ + +namespace juce +{ + +//============================================================================== +/** Describes the attributes of a file or folder. */ +class DirectoryEntry final +{ +public: + /** The path to a file or folder. */ + File getFile() const { return file; } + + /** The time at which the item was last modified. */ + Time getModificationTime() const { return modTime; } + + /** The time at which the item was created. */ + Time getCreationTime() const { return creationTime; } + + /** The size of the item. */ + int64 getFileSize() const { return fileSize; } + + /** True if the item is a directory, false otherwise. */ + bool isDirectory() const { return directory; } + + /** True if the item is hidden, false otherwise. */ + bool isHidden() const { return hidden; } + + /** True if the item is read-only, false otherwise. */ + bool isReadOnly() const { return readOnly; } + +private: + File file; + Time modTime; + Time creationTime; + int64 fileSize = 0; + bool directory = false; + bool hidden = false; + bool readOnly = false; + + friend class RangedDirectoryIterator; +}; + +/** A convenience operator so that the expression `*it++` works correctly when + `it` is an instance of RangedDirectoryIterator. +*/ +inline const DirectoryEntry& operator* (const DirectoryEntry& e) noexcept { return e; } + +//============================================================================== +/** + Allows iterating over files and folders using C++11 range-for syntax. + + In the following example, we recursively find all hidden files in a + specific directory. + + @code + std::vector hiddenFiles; + + for (DirectoryEntry entry : RangedDirectoryIterator (File ("/path/to/folder"), isRecursive)) + if (entry.isHidden()) + hiddenFiles.push_back (entry.getFile()); + @endcode +*/ +class RangedDirectoryIterator final +{ +public: + using difference_type = std::ptrdiff_t; + using value_type = DirectoryEntry; + using reference = DirectoryEntry; + using pointer = void; + using iterator_category = std::input_iterator_tag; + + /** The default-constructed iterator acts as the 'end' sentinel. */ + RangedDirectoryIterator() = default; + + /** Creates a RangedDirectoryIterator for a given directory. + + The resulting iterator can be used directly in a 'range-for' expression. + + @param directory the directory to search in + @param isRecursive whether all the subdirectories should also be searched + @param wildCard the file pattern to match. This may contain multiple patterns + separated by a semi-colon or comma, e.g. "*.jpg;*.png" + @param whatToLookFor a value from the File::TypesOfFileToFind enum, specifying + whether to look for files, directories, or both. + */ + RangedDirectoryIterator (const File& directory, + bool isRecursive, + const String& wildCard = "*", + int whatToLookFor = File::findFiles); + + /** Returns true if both iterators are in their end/sentinel state, + otherwise returns false. + */ + bool operator== (const RangedDirectoryIterator& other) const noexcept + { + return iterator == nullptr && other.iterator == nullptr; + } + + /** Returns the inverse of operator== */ + bool operator!= (const RangedDirectoryIterator& other) const noexcept + { + return ! operator== (other); + } + + /** Return an object containing metadata about the file or folder to + which the iterator is currently pointing. + */ + const DirectoryEntry& operator* () const noexcept { return entry; } + const DirectoryEntry* operator->() const noexcept { return &entry; } + + /** Moves the iterator along to the next file. */ + RangedDirectoryIterator& operator++() + { + increment(); + return *this; + } + + /** Moves the iterator along to the next file. + + @returns an object containing metadata about the file or folder to + to which the iterator was previously pointing. + */ + DirectoryEntry operator++ (int) + { + auto result = *(*this); + ++(*this); + return result; + } + +private: + bool next(); + void increment(); + + std::shared_ptr iterator; + DirectoryEntry entry; +}; + +/** Returns the iterator that was passed in. + Provided for range-for compatibility. +*/ +inline RangedDirectoryIterator begin (const RangedDirectoryIterator& it) { return it; } + +/** Returns a default-constructed sentinel value. + Provided for range-for compatibility. +*/ +inline RangedDirectoryIterator end (const RangedDirectoryIterator&) { return {}; } + +} // namespace juce diff --git a/modules/juce_core/juce_core.cpp b/modules/juce_core/juce_core.cpp index 2799122708..0aedbba2a7 100644 --- a/modules/juce_core/juce_core.cpp +++ b/modules/juce_core/juce_core.cpp @@ -124,6 +124,7 @@ #include "containers/juce_ReferenceCountedArray.cpp" #include "containers/juce_SparseSet.cpp" #include "files/juce_DirectoryIterator.cpp" +#include "files/juce_RangedDirectoryIterator.cpp" #include "files/juce_File.cpp" #include "files/juce_FileInputStream.cpp" #include "files/juce_FileOutputStream.cpp" diff --git a/modules/juce_core/juce_core.h b/modules/juce_core/juce_core.h index 8108f1b28a..a1c54d7d2c 100644 --- a/modules/juce_core/juce_core.h +++ b/modules/juce_core/juce_core.h @@ -283,6 +283,7 @@ JUCE_END_IGNORE_WARNINGS_MSVC #include "streams/juce_InputSource.h" #include "files/juce_File.h" #include "files/juce_DirectoryIterator.h" +#include "files/juce_RangedDirectoryIterator.h" #include "files/juce_FileInputStream.h" #include "files/juce_FileOutputStream.h" #include "files/juce_FileSearchPath.h" diff --git a/modules/juce_core/native/juce_android_Files.cpp b/modules/juce_core/native/juce_android_Files.cpp index 4163c59a55..9fedfc2688 100644 --- a/modules/juce_core/native/juce_android_Files.cpp +++ b/modules/juce_core/native/juce_android_Files.cpp @@ -319,9 +319,8 @@ private: return {}; auto rootFsDevice = info.st_dev; - DirectoryIterator iter (mountFolder, false, "*", File::findDirectories); - while (iter.next()) + for (const auto& iter : RangedDirectoryIterator (mountFolder, false, "*", File::findDirectories)) { auto candidate = iter.getFile(); diff --git a/modules/juce_core/system/juce_StandardHeader.h b/modules/juce_core/system/juce_StandardHeader.h index 89938d9347..08016a4e07 100644 --- a/modules/juce_core/system/juce_StandardHeader.h +++ b/modules/juce_core/system/juce_StandardHeader.h @@ -43,22 +43,24 @@ //============================================================================== -#include -#include -#include -#include -#include #include -#include #include -#include -#include -#include -#include -#include -#include +#include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include #include +#include +#include +#include //============================================================================== #include "juce_CompilerSupport.h" diff --git a/modules/juce_graphics/native/juce_freetype_Fonts.cpp b/modules/juce_graphics/native/juce_freetype_Fonts.cpp index 80bae2c43f..ac173578f3 100644 --- a/modules/juce_graphics/native/juce_freetype_Fonts.cpp +++ b/modules/juce_graphics/native/juce_freetype_Fonts.cpp @@ -190,9 +190,7 @@ public: { for (auto& path : paths) { - DirectoryIterator iter (File::getCurrentWorkingDirectory().getChildFile (path), true); - - while (iter.next()) + for (const auto iter : RangedDirectoryIterator (File::getCurrentWorkingDirectory().getChildFile (path), true)) if (iter.getFile().hasFileExtension ("ttf;pfb;pcf;otf")) scanFont (iter.getFile()); } diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp index 4f01b8748c..4b1d3e1b31 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.cpp @@ -81,14 +81,14 @@ void DirectoryContentsList::stopSearching() { shouldStop = true; thread.removeTimeSliceClient (this); - fileFindHandle.reset(); + fileFindHandle = nullptr; } void DirectoryContentsList::clear() { stopSearching(); - if (files.size() > 0) + if (! files.isEmpty()) { files.clear(); changed(); @@ -103,7 +103,7 @@ void DirectoryContentsList::refresh() if (root.isDirectory()) { - fileFindHandle.reset (new DirectoryIterator (root, false, "*", fileTypeFlags)); + fileFindHandle = std::make_unique (root, false, "*", fileTypeFlags); shouldStop = false; thread.addTimeSliceClient (this); } @@ -196,15 +196,16 @@ bool DirectoryContentsList::checkNextFile (bool& hasChanged) { if (fileFindHandle != nullptr) { - bool fileFoundIsDir, isHidden, isReadOnly; - int64 fileSize; - Time modTime, creationTime; - - if (fileFindHandle->next (&fileFoundIsDir, &isHidden, &fileSize, - &modTime, &creationTime, &isReadOnly)) + if (*fileFindHandle != RangedDirectoryIterator()) { - if (addFile (fileFindHandle->getFile(), fileFoundIsDir, - fileSize, modTime, creationTime, isReadOnly)) + const auto entry = *(*fileFindHandle)++; + + if (addFile (entry.getFile(), + entry.isDirectory(), + entry.getFileSize(), + entry.getModificationTime(), + entry.getCreationTime(), + entry.isReadOnly())) { hasChanged = true; } @@ -212,7 +213,7 @@ bool DirectoryContentsList::checkNextFile (bool& hasChanged) return true; } - fileFindHandle.reset(); + fileFindHandle = nullptr; if (! wasEmpty && files.isEmpty()) hasChanged = true; diff --git a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h index 3682273d8b..c6e8991038 100644 --- a/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h +++ b/modules/juce_gui_basics/filebrowser/juce_DirectoryContentsList.h @@ -200,7 +200,7 @@ private: CriticalSection fileListLock; OwnedArray files; - std::unique_ptr fileFindHandle; + std::unique_ptr fileFindHandle; std::atomic shouldStop { true }; bool wasEmpty = true;