Added New Utility methods.
-Added: bulk putIfAbsent & AddTo function -Added: ArrayPut method simplify adding arrays into a map. -Added: Bulk Replace function that uses a "Map" instead of a lambda -Added: Bulk Merge function
This commit is contained in:
		
							parent
							
								
									b9d49aea65
								
							
						
					
					
						commit
						a319e0136a
					
				@ -211,6 +211,7 @@ public class GlobalVariables
 | 
				
			|||||||
		addSimpleMapper("APPLY_VALUE", valueType.isObject() ? "apply" : "applyAs"+valueType.getNonFileType());
 | 
							addSimpleMapper("APPLY_VALUE", valueType.isObject() ? "apply" : "applyAs"+valueType.getNonFileType());
 | 
				
			||||||
		addSimpleMapper("APPLY_CAST", "applyAs"+type.getCustomJDKType().getNonFileType());
 | 
							addSimpleMapper("APPLY_CAST", "applyAs"+type.getCustomJDKType().getNonFileType());
 | 
				
			||||||
		addSimpleMapper("APPLY", type.isObject() ? "apply" : "applyAs"+type.getNonFileType());
 | 
							addSimpleMapper("APPLY", type.isObject() ? "apply" : "applyAs"+type.getNonFileType());
 | 
				
			||||||
 | 
							addFunctionValueMapper("BULK_MERGE", "mergeAll");
 | 
				
			||||||
		addFunctionValueMappers("COMPUTE_IF_ABSENT", "compute%sIfAbsent");
 | 
							addFunctionValueMappers("COMPUTE_IF_ABSENT", "compute%sIfAbsent");
 | 
				
			||||||
		addFunctionValueMappers("COMPUTE_IF_PRESENT", "compute%sIfPresent");
 | 
							addFunctionValueMappers("COMPUTE_IF_PRESENT", "compute%sIfPresent");
 | 
				
			||||||
		addFunctionValueMapper("COMPUTE", "compute");
 | 
							addFunctionValueMapper("COMPUTE", "compute");
 | 
				
			||||||
 | 
				
			|||||||
@ -24,6 +24,7 @@ import speiger.src.collections.objects.collections.ObjectIterator;
 | 
				
			|||||||
#if !TYPE_OBJECT
 | 
					#if !TYPE_OBJECT
 | 
				
			||||||
import speiger.src.collections.objects.sets.ObjectSet;
 | 
					import speiger.src.collections.objects.sets.ObjectSet;
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					import speiger.src.collections.utils.SanityChecks;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
 * A Base Implementation of a Type Specific Map to reduce boxing/unboxing
 | 
					 * A Base Implementation of a Type Specific Map to reduce boxing/unboxing
 | 
				
			||||||
@ -45,6 +46,14 @@ public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap<CL
 | 
				
			|||||||
		return this;
 | 
							return this;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
					#if VALUE_PRIMITIVES
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void addToAll(MAP KEY_VALUE_GENERIC_TYPE m) {
 | 
				
			||||||
 | 
							for(MAP.Entry KEY_VALUE_GENERIC_TYPE entry : MAPS.fastIterable(m))
 | 
				
			||||||
 | 
								addTo(entry.ENTRY_KEY(), entry.ENTRY_VALUE());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void putAll(MAP KEY_VALUE_GENERIC_TYPE m) {
 | 
						public void putAll(MAP KEY_VALUE_GENERIC_TYPE m) {
 | 
				
			||||||
		for(ObjectIterator<MAP.Entry KEY_VALUE_GENERIC_TYPE> iter = MAPS.fastIterator(m);iter.hasNext();) {
 | 
							for(ObjectIterator<MAP.Entry KEY_VALUE_GENERIC_TYPE> iter = MAPS.fastIterator(m);iter.hasNext();) {
 | 
				
			||||||
@ -60,6 +69,19 @@ public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap<CL
 | 
				
			|||||||
		else super.putAll(m);
 | 
							else super.putAll(m);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void putAll(KEY_TYPE[] keys, VALUE_TYPE[] values, int offset, int size) {
 | 
				
			||||||
 | 
							SanityChecks.checkArrayCapacity(keys.length, offset, size);
 | 
				
			||||||
 | 
							SanityChecks.checkArrayCapacity(values.length, offset, size);
 | 
				
			||||||
 | 
							for(int i = 0;i<size;i++) put(keys[i], values[i]);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void putAllIfAbsent(MAP KEY_VALUE_GENERIC_TYPE m) {
 | 
				
			||||||
 | 
							for(MAP.Entry KEY_VALUE_GENERIC_TYPE entry : MAPS.fastIterable(m))
 | 
				
			||||||
 | 
								putIfAbsent(entry.ENTRY_KEY(), entry.ENTRY_VALUE());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
#if TYPE_OBJECT
 | 
					#if TYPE_OBJECT
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
@ -114,6 +136,12 @@ public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap<CL
 | 
				
			|||||||
        return curValue;
 | 
					        return curValue;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void REPLACE_VALUES(MAP KEY_VALUE_GENERIC_TYPE m) {
 | 
				
			||||||
 | 
							for(MAP.Entry KEY_VALUE_GENERIC_TYPE entry : MAPS.fastIterable(m))
 | 
				
			||||||
 | 
								replace(entry.ENTRY_KEY(), entry.ENTRY_VALUE());
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public void REPLACE_VALUES(UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) {
 | 
						public void REPLACE_VALUES(UNARY_OPERATOR KEY_VALUE_GENERIC_TYPE mappingFunction) {
 | 
				
			||||||
		Objects.requireNonNull(mappingFunction);
 | 
							Objects.requireNonNull(mappingFunction);
 | 
				
			||||||
@ -178,6 +206,18 @@ public abstract class ABSTRACT_MAP KEY_VALUE_GENERIC_TYPE extends AbstractMap<CL
 | 
				
			|||||||
		return newValue;
 | 
							return newValue;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						@Override
 | 
				
			||||||
 | 
						public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction) {
 | 
				
			||||||
 | 
						    Objects.requireNonNull(mappingFunction);
 | 
				
			||||||
 | 
							for(MAP.Entry KEY_VALUE_GENERIC_TYPE entry : MAPS.fastIterable(m)) {
 | 
				
			||||||
 | 
								KEY_TYPE key = entry.ENTRY_KEY();
 | 
				
			||||||
 | 
						        VALUE_TYPE oldValue = GET_VALUE(key);
 | 
				
			||||||
 | 
						        VALUE_TYPE newValue = VALUE_EQUALS(oldValue, getDefaultReturnValue()) ? entry.ENTRY_VALUE() : mappingFunction.APPLY_VALUE(oldValue, entry.ENTRY_VALUE());
 | 
				
			||||||
 | 
						        if(VALUE_EQUALS(newValue, getDefaultReturnValue())) remove(key);
 | 
				
			||||||
 | 
						        else put(key, newValue);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
#if TYPE_OBJECT
 | 
					#if TYPE_OBJECT
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
	public CLASS_VALUE_TYPE get(Object key) {
 | 
						public CLASS_VALUE_TYPE get(Object key) {
 | 
				
			||||||
 | 
				
			|||||||
@ -50,6 +50,30 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map<CLASS_TYPE, CLASS_VALUE_
 | 
				
			|||||||
	 * @see Map#put(Object, Object)
 | 
						 * @see Map#put(Object, Object)
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public VALUE_TYPE put(KEY_TYPE key, VALUE_TYPE value);
 | 
						public VALUE_TYPE put(KEY_TYPE key, VALUE_TYPE value);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Type Specific array method to bulk add elements into a map without creating a wrapper and increasing performances
 | 
				
			||||||
 | 
						 * @param keys the keys that should be added
 | 
				
			||||||
 | 
						 * @param values the values that should be added
 | 
				
			||||||
 | 
						 * @see Map#putAll(Map)
 | 
				
			||||||
 | 
						 * @throws IllegalStateException if the arrays are not the same size
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public default void putAll(KEY_TYPE[] keys, VALUE_TYPE[] values) {
 | 
				
			||||||
 | 
							if(keys.length != values.length) throw new IllegalStateException("Array sizes do not match");
 | 
				
			||||||
 | 
							putAll(keys, values, 0, keys.length);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Type Specific array method to bulk add elements into a map without creating a wrapper and increasing performances
 | 
				
			||||||
 | 
						 * @param keys the keys that should be added
 | 
				
			||||||
 | 
						 * @param values the values that should be added
 | 
				
			||||||
 | 
						 * @param offset where the to start in the array
 | 
				
			||||||
 | 
						 * @param size how many elements should be added
 | 
				
			||||||
 | 
						 * @see Map#putAll(Map)
 | 
				
			||||||
 | 
						 * @throws IllegalStateException if the arrays are not within the range
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void putAll(KEY_TYPE[] keys, VALUE_TYPE[] values, int offset, int size);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Type Specific method to reduce boxing/unboxing of values
 | 
						 * Type Specific method to reduce boxing/unboxing of values
 | 
				
			||||||
	 * @param key the key that should be inserted,
 | 
						 * @param key the key that should be inserted,
 | 
				
			||||||
@ -59,6 +83,12 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map<CLASS_TYPE, CLASS_VALUE_
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	public VALUE_TYPE putIfAbsent(KEY_TYPE key, VALUE_TYPE value);
 | 
						public VALUE_TYPE putIfAbsent(KEY_TYPE key, VALUE_TYPE value);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Type-Specific bulk put method put elements into the map if not present.
 | 
				
			||||||
 | 
						 * @param m elements that should be added if not present.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void putAllIfAbsent(MAP KEY_VALUE_GENERIC_TYPE m);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
#if VALUE_PRIMITIVES
 | 
					#if VALUE_PRIMITIVES
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * A Helper method to add a primitives together. If key is not present then this functions as a put.
 | 
						 * A Helper method to add a primitives together. If key is not present then this functions as a put.
 | 
				
			||||||
@ -68,6 +98,12 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map<CLASS_TYPE, CLASS_VALUE_
 | 
				
			|||||||
	 */
 | 
						 */
 | 
				
			||||||
	public VALUE_TYPE addTo(KEY_TYPE key, VALUE_TYPE value);
 | 
						public VALUE_TYPE addTo(KEY_TYPE key, VALUE_TYPE value);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * A Helper method to bulk add primitives together.
 | 
				
			||||||
 | 
						 * @param m the values that should be added/inserted
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void addToAll(MAP KEY_VALUE_GENERIC_TYPE m);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * Type Specific function for the bull putting of values
 | 
						 * Type Specific function for the bull putting of values
 | 
				
			||||||
@ -182,6 +218,12 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map<CLASS_TYPE, CLASS_VALUE_
 | 
				
			|||||||
	 * @note this fails if the value is not present
 | 
						 * @note this fails if the value is not present
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public VALUE_TYPE replace(KEY_TYPE key, VALUE_TYPE value);
 | 
						public VALUE_TYPE replace(KEY_TYPE key, VALUE_TYPE value);
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * Type-Specific bulk replace method. Could be seen as putAllIfPresent
 | 
				
			||||||
 | 
						 * @param m elements that should be replaced.
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void REPLACE_VALUES(MAP KEY_VALUE_GENERIC_TYPE m);
 | 
				
			||||||
	/**
 | 
						/**
 | 
				
			||||||
	 * A Type Specific mass replace method to reduce boxing/unboxing
 | 
						 * A Type Specific mass replace method to reduce boxing/unboxing
 | 
				
			||||||
	 * @param mappingFunction operation to replace all values
 | 
						 * @param mappingFunction operation to replace all values
 | 
				
			||||||
@ -218,6 +260,13 @@ public interface MAP KEY_VALUE_GENERIC_TYPE extends Map<CLASS_TYPE, CLASS_VALUE_
 | 
				
			|||||||
	 * @note if the result matches the default return value then the key is removed from the map
 | 
						 * @note if the result matches the default return value then the key is removed from the map
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction);
 | 
						public VALUE_TYPE MERGE(KEY_TYPE key, VALUE_TYPE value, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction);
 | 
				
			||||||
 | 
						/**
 | 
				
			||||||
 | 
						 * A Bulk method for merging Maps.
 | 
				
			||||||
 | 
						 * @param m the entries that should be bulk added
 | 
				
			||||||
 | 
						 * @param mappingFunction the operator that should generate the new Value
 | 
				
			||||||
 | 
						 * @note if the result matches the default return value then the key is removed from the map
 | 
				
			||||||
 | 
						 */
 | 
				
			||||||
 | 
						public void BULK_MERGE(MAP KEY_VALUE_GENERIC_TYPE m, VALUE_UNARY_OPERATOR VALUE_VALUE_GENERIC_TYPE mappingFunction);
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
#if !TYPE_OBJECT || !VALUE_OBJECT
 | 
					#if !TYPE_OBJECT || !VALUE_OBJECT
 | 
				
			||||||
	@Override
 | 
						@Override
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user