diff --git a/Changelog.md b/Changelog.md index 40742547..21af5b76 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,6 @@ # Changelog of versions -### Version 0.8.0 (Unreleased) +### Version 0.8.0 - Added: ISizeProvider interface (Optimization Helper) - Added: ISizeProvider into most Iterable implementations (Distinct/Filter/FlatMap/ArrayFlatMap don't support it, for obvious reasons) - Added: ToArray function into Iterable which uses ISizeProvider to reduce overhead of duplicating arrays. @@ -11,6 +11,7 @@ - Added: Optimizations for HashUtils next power of function. - Added: toArray() now returns a cached empty array if the collection is empty. - Added: toArray function for AsyncBuilder +- Added: Modularization to the library where feature can be disabled as needed. (Requires Self-Compilation) - Fixed: putIfAbsent now replaces defaultValues - Fixed: OpenHashSet/Map and their Custom Variants no longer rely on List implementations. - Fixed: ObjectCopyOnWriteList.of did create a ObjectArrayList instead of the CopyOnWrite variant. diff --git a/EXTRAS.md b/EXTRAS.md new file mode 100644 index 00000000..e6565592 --- /dev/null +++ b/EXTRAS.md @@ -0,0 +1,41 @@ +### Extra Features + +Primitive Collections comes with a few extra features that are disabled by default. +These will be enabled as soon they become relevant or never at all. + +But some of these can be already unlocked when the target version changes. + +If you compile the library for yourself you will automatically gain access to said features. + +### Java17 Exclusive Features +Java17 has some new features that can sadly not really be back-ported but the library still supports them if it is compiled with java17 + +- RandomGenerator: Java17 has added [RandomGenerator.class](https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/random/RandomGenerator.html). + This allows to use custom random implementations without having to re-implement them yourselves. + + +### ModuleSettings +Primitive Collections is a huge library. +But maybe you only use like 5-10 different classes. +Normally you would use tools like "Proguard" to get rid of classes that you don't use. +But since a lot of classes have dependencies on each other this would only do so much. + +This is where the [ModuleSettings](ModuleSettings.json) come into play. +It allows you to turn of implementations as you wish and adjusts the code that everything still works. + +There is 3 layers of control inside of the ModuleSettings. +- Modules directly at the top that turn off everything. +- Type Specific configurations, where you can for example turn of everything thats "Long" based. +- And then there is each type specific module settings. + +Allowing for greater control without having to edit hundreds of lines of code. +On top of that: +Any Setting that isn't "Present" is counted as "Enabled". +So if you want to disable just 1 thing you can keep that 1 thing and delete the rest of the Setting. +It will still work as the same. +The default settings just come with everything so you can see what is controllable. + +How to compile the Code with the ModuleSettings enabled: +``` +/gradlew.bat generateLimitSource build -x test +``` diff --git a/README.md b/README.md index a8ebbb80..7ae01fdc 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,10 @@ Benchmarks can be found here: [[Charts]](https://github.com/Speiger/Primitive-Co [Here](features.md) you find a set of features added to Primitive Collections. These are designed to improve performance or to provide Quality of Life. +[Here](EXTRAS.md) you also find features that can be used when you compile the library for yourself. +These features are not used by default to have a wider range of compat, or require self compilation. +Such as pruning classes that are not needed in your code. + ## Main Features: - ArrayLists / LinkedLists / CopyOnWriteLists - HashSets/Maps (Linked & HashControl) @@ -71,7 +75,11 @@ Please if you want to contribute follow the [Rule-Sheet](RuleSheet.md). It keeps # How to Build The SourceCode can be generated via: +``` /gradlew.bat generateSource +``` to generate SourceCode and build the jar: -/gradlew.bat build \ No newline at end of file +``` +/gradlew.bat build +``` diff --git a/build.gradle b/build.gradle index 82fb672c..f88e48ad 100644 --- a/build.gradle +++ b/build.gradle @@ -83,6 +83,14 @@ task generateTestSource(type: JavaExec) { args = ['tests', 'silent'] } +task generateLimitSource(type: JavaExec) { + group = 'internal' + description = 'Builds the Sourcecode with the ModuleSettings.json applied' + classpath = sourceSets.builder.runtimeClasspath + main = 'speiger.src.builder.PrimitiveCollectionsBuilder' + args = ['silent', 'load'] +} + task javadocJar(type: Jar) { from javadoc classifier = 'javadoc' diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/AsyncBuilder.template b/src/builder/resources/speiger/assets/collections/templates/utils/AsyncBuilder.template index e198502c..50e70ffd 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/AsyncBuilder.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/AsyncBuilder.template @@ -782,6 +782,7 @@ public class ASYNC_BUILDER KEY_GENERIC_TYPE setResult(wrapper.TO_ARRAY()); #endif wrapper = null; + return true; } return false; } diff --git a/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template b/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template index 69c9bef8..5d26d23a 100644 --- a/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template +++ b/src/builder/resources/speiger/assets/collections/templates/utils/Collections.template @@ -36,6 +36,7 @@ import speiger.src.collections.PACKAGE.utils.ARRAYS; import speiger.src.collections.PACKAGE.functions.function.PREDICATE; #endif import speiger.src.collections.PACKAGE.functions.function.UNARY_OPERATOR; +import speiger.src.collections.ints.functions.consumer.BI_FROM_INT_CONSUMER; import speiger.src.collections.objects.functions.consumer.BI_FROM_OBJECT_CONSUMER; #if !TYPE_BOOLEAN import speiger.src.collections.utils.HashUtil; @@ -777,6 +778,8 @@ public class COLLECTIONS @Override public void forEach(Consumer action) { synchronized(mutex) { c.forEach(action); } } #endif + @Override + public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { synchronized(mutex) { c.forEachIndexed(action); } } @Override public int hashCode() { synchronized(mutex) { return c.hashCode(); } } @Override @@ -902,6 +905,8 @@ public class COLLECTIONS @Override public void forEach(Consumer action) { c.forEach(action); } #endif + @Override + public void forEachIndexed(BI_FROM_INT_CONSUMER KEY_GENERIC_TYPE action) { c.forEachIndexed(action); } @Override public int hashCode() { return c.hashCode(); } @Override