Index: libcfa/src/stdlib.hfa
===================================================================
--- libcfa/src/stdlib.hfa	(revision ca7949b76a85d5849fcb348fbe59dde3c18c66a8)
+++ libcfa/src/stdlib.hfa	(revision 7030dab75c493bbd89de53cb88e496019c794ff4)
@@ -10,6 +10,6 @@
 // Created On       : Thu Jan 28 17:12:35 2016
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar  5 11:29:06 2020
-// Update Count     : 407
+// Last Modified On : Wed Apr  1 18:38:41 2020
+// Update Count     : 429
 //
 
@@ -24,9 +24,12 @@
 extern "C" {
 	void * memalign( size_t align, size_t size );		// malloc.h
-    void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA heap
+	size_t malloc_usable_size( void * ptr );			// malloc.h
+	void * cmemalign( size_t alignment, size_t noOfElems, size_t elemSize ); // CFA heap
 	void * memset( void * dest, int fill, size_t size ); // string.h
 	void * memcpy( void * dest, const void * src, size_t size ); // string.h
+	void * resize( void * oaddr, size_t size );			// CFA heap
 } // extern "C"
 
+void * resize( void * oaddr, size_t nalign, size_t size ); // CFA heap
 void * realloc( void * oaddr, size_t nalign, size_t size ); // CFA heap
 
@@ -72,5 +75,7 @@
 		return posix_memalign( (void **)ptr, align, sizeof(T) ); // C posix_memalign
 	} // posix_memalign
-
+} // distribution
+
+static inline forall( dtype T | sized(T) ) {
 	// Cforall safe general allocation, fill, resize, array
 
@@ -84,6 +89,23 @@
 	} // alloc
 
-	T * alloc( T ptr[], size_t dim ) {					// realloc
-		return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
+	forall( dtype S | sized(S) )
+	T * alloc( S ptr[], size_t dim = 1 ) {				// singleton/array resize
+		size_t len = malloc_usable_size( ptr );			// current bucket size
+		if ( sizeof(T) * dim > len ) {					// not enough space ?
+			T * temp = alloc( dim );					// new storage
+			free( ptr );								// free old storage
+			return temp;
+		} else {
+			return (T *)ptr;
+		} // if
+	} // alloc
+
+	T * alloc( T ptr[], size_t dim, bool copy = true ) {
+		if ( copy ) {									// realloc
+			return (T *)(void *)realloc( (void *)ptr, dim * sizeof(T) ); // C realloc
+		} else {
+			struct __Unknown {};
+			return alloc( (__Unknown *)ptr, dim );		// reuse, cheat making T/S different types
+		} // if
 	} // alloc
 
@@ -113,4 +135,5 @@
 forall( dtype T | sized(T) ) {
 	T * alloc_set( T ptr[], size_t dim, char fill );	// realloc array with fill
+	T * alloc_set( T ptr[], size_t dim, T fill );		// realloc array with fill
 } // distribution
 
@@ -126,4 +149,9 @@
 	T * alloc_align( T ptr[], size_t align ) {			// aligned realloc array
 		return (T *)(void *)realloc( (void *)ptr, align, sizeof(T) ); // CFA realloc
+	} // alloc_align
+
+	forall( dtype S | sized(S) )
+	T * alloc_align( S ptr[], size_t align ) {			// aligned reuse array
+		return (T *)(void *)resize( (void *)ptr, align, sizeof(T) ); // CFA realloc
 	} // alloc_align
 
@@ -156,5 +184,8 @@
 
 forall( dtype T | sized(T) ) {
+	T * alloc_align_set( T ptr[], size_t align, char fill ); // aligned realloc with fill
+	T * alloc_align_set( T ptr[], size_t align, T fill ); // aligned realloc with fill
 	T * alloc_align_set( T ptr[], size_t align, size_t dim, char fill ); // aligned realloc array with fill
+	T * alloc_align_set( T ptr[], size_t align, size_t dim, T fill ); // aligned realloc array with fill
 } // distribution
 
