#OTHER by cg
authorClaus Gittinger <cg@exept.de>
Tue, 30 Aug 2016 17:19:53 +0200
changeset 20313 1280e2eafb73
parent 20312 04fab301a9fd
child 20314 7545d09005ca
#OTHER by cg class: FloatArray removed: #max #min changed: #minMax
FloatArray.st
--- a/FloatArray.st	Mon Aug 29 11:06:09 2016 +0200
+++ b/FloatArray.st	Tue Aug 30 17:19:53 2016 +0200
@@ -2,7 +2,7 @@
 
 "
  COPYRIGHT (c) 1993 by Claus Gittinger
-	      All Rights Reserved
+              All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -16,10 +16,10 @@
 "{ NameSpace: Smalltalk }"
 
 AbstractNumberVector variableFloatSubclass:#FloatArray
-	instanceVariableNames:''
-	classVariableNames:''
-	poolDictionaries:''
-	category:'Collections-Arrayed'
+        instanceVariableNames:''
+        classVariableNames:''
+        poolDictionaries:''
+        category:'Collections-Arrayed'
 !
 
 !FloatArray class methodsFor:'documentation'!
@@ -27,7 +27,7 @@
 copyright
 "
  COPYRIGHT (c) 1993 by Claus Gittinger
-	      All Rights Reserved
+              All Rights Reserved
 
  This software is furnished under a license and may be used
  only in accordance with the terms of that license and with the
@@ -46,16 +46,18 @@
     See documentation in DoubleArray for more information.
 
     [memory requirements:]
-	OBJ-HEADER + (size * float-size)
+        OBJ-HEADER + (size * float-size)
 
     [See also:]
-	DoubleArray Array
+        DoubleArray Array
 
     [author:]
-	Claus Gittinger
+        Claus Gittinger
 "
 ! !
 
+
+
 !FloatArray class methodsFor:'queries'!
 
 elementByteSize
@@ -67,6 +69,7 @@
     "Created: / 15-09-2011 / 14:12:39 / cg"
 ! !
 
+
 !FloatArray methodsFor:'copying'!
 
 clone
@@ -77,13 +80,13 @@
     newArr := self class new:(self size).
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
+        INT _sz = __floatArraySize(self);
 
-	bcopy(__FloatArrayInstPtr(self)->f_element,
-	      __FloatArrayInstPtr(newArr)->f_element,
-	      sizeof(float) * _sz);
+        bcopy(__FloatArrayInstPtr(self)->f_element,
+              __FloatArrayInstPtr(newArr)->f_element,
+              sizeof(float) * _sz);
 
-	RETURN (newArr);
+        RETURN (newArr);
     }
 %}.
     newArr replaceFrom:1 to:self size with:self startingAt:1.
@@ -102,37 +105,37 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	if (__bothSmallInteger(start, stop)) {
-	    INT __start = __intVal(start) - 1;
-	    INT __stop = __intVal(stop) - 1 ;
+        if (__bothSmallInteger(start, stop)) {
+            INT __start = __intVal(start) - 1;
+            INT __stop = __intVal(stop) - 1 ;
 
-	    if (__stop >= __start) {
-		INT __sz = __floatArraySize(self);
-		// printf("o_size=%d floatArraySize=%d\n", __qSize(self), __sz);
+            if (__stop >= __start) {
+                INT __sz = __floatArraySize(self);
+                // printf("o_size=%d floatArraySize=%d\n", __qSize(self), __sz);
 
-		if (((unsigned INT)__start < __sz)
-		 && ((unsigned INT)__stop < __sz)) {
-		    INT __n = __stop - __start + 1;
-		    OBJ __nObj;
-		    int nBytes;
+                if (((unsigned INT)__start < __sz)
+                 && ((unsigned INT)__stop < __sz)) {
+                    INT __n = __stop - __start + 1;
+                    OBJ __nObj;
+                    int nBytes;
 
-		    // don't do this; sizeof returns the padded size!
-		    // nBytes = sizeof(struct __FloatArray) + (__n - 1) * sizeof(float);
-		    nBytes = OHDR_SIZE + (__n * sizeof(float));
+                    // don't do this; sizeof returns the padded size!
+                    // nBytes = sizeof(struct __FloatArray) + (__n - 1) * sizeof(float);
+                    nBytes = OHDR_SIZE + (__n * sizeof(float));
 
-		    // printf("__n=%d nBytes=%d\n", __n, nBytes);
-		    __nObj = __STX___new(nBytes);
-		    if (__nObj != nil) {
-			__objPtr(__nObj)->o_class = __qClass(self);
-			__STORE(__nObj, __qClass(self));
-			bcopy(__FloatArrayInstPtr(self)->f_element + __start,
-			      __FloatArrayInstPtr(__nObj)->f_element,
-			      sizeof(float) * __n);
-			RETURN(__nObj);
-		    }
-		}
-	    }
-	}
+                    // printf("__n=%d nBytes=%d\n", __n, nBytes);
+                    __nObj = __STX___new(nBytes);
+                    if (__nObj != nil) {
+                        __objPtr(__nObj)->o_class = __qClass(self);
+                        __STORE(__nObj, __qClass(self));
+                        bcopy(__FloatArrayInstPtr(self)->f_element + __start,
+                              __FloatArrayInstPtr(__nObj)->f_element,
+                              sizeof(float) * __n);
+                        RETURN(__nObj);
+                    }
+                }
+            }
+        }
     }
 %}.
     ^ super copyFrom:start to:stop
@@ -149,38 +152,38 @@
 replaceFrom:start to:stop with:aCollection startingAt:replStart
 %{
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
-	 && __isFloats(aCollection)
-	 && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0))
-	 && __bothSmallInteger(start, stop)
-	 && __isSmallInteger(replStart)
+         && __isFloats(aCollection)
+         && (__ClassInstPtr(__qClass(aCollection))->c_ninstvars == __mkSmallInteger(0))
+         && __bothSmallInteger(start, stop)
+         && __isSmallInteger(replStart)
     ) {
-	INT __start = __intVal(start) - 1;
-	INT __stop = __intVal(stop) - 1 ;
-	INT __replStart = __intVal(replStart) - 1 ;
+        INT __start = __intVal(start) - 1;
+        INT __stop = __intVal(stop) - 1 ;
+        INT __replStart = __intVal(replStart) - 1 ;
 
-	if (__stop >= __start) {
-	    INT __sz = __floatArraySize(self);
-	    INT __otherSz = __floatArraySize(aCollection);
-	    INT __replStop = __replStart + (__stop-__start);
+        if (__stop >= __start) {
+            INT __sz = __floatArraySize(self);
+            INT __otherSz = __floatArraySize(aCollection);
+            INT __replStop = __replStart + (__stop-__start);
 
-	    if (((unsigned INT)__start < __sz)
-	     && ((unsigned INT)__stop < __sz)
-	     && ((unsigned INT)__replStart < __otherSz)
-	     && ((unsigned INT)__replStop < __otherSz)) {
-		INT __n = __stop - __start + 1;
+            if (((unsigned INT)__start < __sz)
+             && ((unsigned INT)__stop < __sz)
+             && ((unsigned INT)__replStart < __otherSz)
+             && ((unsigned INT)__replStop < __otherSz)) {
+                INT __n = __stop - __start + 1;
 
-		if (aCollection == self) {
-		    memmove(&(__FloatArrayInstPtr(self)->f_element[__start]),
-			    &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
-			    sizeof(float) * __n);
-		} else {
-		    memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]),
-			   &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
-			   sizeof(float) * __n);
-		}
-		RETURN(self);
-	    }
-	}
+                if (aCollection == self) {
+                    memmove(&(__FloatArrayInstPtr(self)->f_element[__start]),
+                            &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
+                            sizeof(float) * __n);
+                } else {
+                    memcpy(&(__FloatArrayInstPtr(self)->f_element[__start]),
+                           &(__FloatArrayInstPtr(aCollection)->f_element[__replStart]),
+                           sizeof(float) * __n);
+                }
+                RETURN(self);
+            }
+        }
     }
 %}.
     ^ super replaceFrom:start to:stop with:aCollection startingAt:replStart
@@ -201,27 +204,27 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
-	INT i;
-	float *_p = __FloatArrayInstPtr(self)->f_element;
-	float prev_p;
+        INT _sz = __floatArraySize(self);
+        INT i;
+        float *_p = __FloatArrayInstPtr(self)->f_element;
+        float prev_p;
 
-	if (_sz > 0) {
-	    /* how about inline-mmx-asm for this ... */
-	    prev_p = _p[0];
-	    for (i=1; i<_sz; i++) {
-		float next_p = _p[i];
+        if (_sz > 0) {
+            /* how about inline-mmx-asm for this ... */
+            prev_p = _p[0];
+            for (i=1; i<_sz; i++) {
+                float next_p = _p[i];
 
-		if (prev_p < 0) {
-		    _p[i-1] = -prev_p;
-		}
-		prev_p = next_p;
-	    }
-	    if (prev_p < 0) {
-		_p[i-1] = -prev_p;
-	    }
-	}
-	RETURN (self);
+                if (prev_p < 0) {
+                    _p[i-1] = -prev_p;
+                }
+                prev_p = next_p;
+            }
+            if (prev_p < 0) {
+                _p[i-1] = -prev_p;
+            }
+        }
+        RETURN (self);
     }
 %}.
     super primAbs
@@ -245,29 +248,29 @@
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
      && __isFloats(floatArray)
      && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
-	INT _sz1 = __floatArraySize(self);
-	INT _sz2 = __floatArraySize(floatArray);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+        INT _sz1 = __floatArraySize(self);
+        INT _sz2 = __floatArraySize(floatArray);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
 
-	if (_sz1 > 0) {
-	    if (_sz2 >= _sz1) {
-		/* how about inline-mmx-asm for this ... */
-		float prev_p1 = _p1[0];
-		float prev_p2 = _p2[0];
+        if (_sz1 > 0) {
+            if (_sz2 >= _sz1) {
+                /* how about inline-mmx-asm for this ... */
+                float prev_p1 = _p1[0];
+                float prev_p2 = _p2[0];
 
-		for (i=1; i<_sz1; i++) {
-		    float next_p1 = _p1[i];
-		    float next_p2 = _p2[i];
-		    _p1[i-1] = prev_p1 + prev_p2;
-		    prev_p1 = next_p1;
-		    prev_p2 = next_p2;
-		}
-		_p1[i-1] = prev_p1 + prev_p2;
-	    }
-	}
-	RETURN (self);
+                for (i=1; i<_sz1; i++) {
+                    float next_p1 = _p1[i];
+                    float next_p2 = _p2[i];
+                    _p1[i-1] = prev_p1 + prev_p2;
+                    prev_p1 = next_p1;
+                    prev_p2 = next_p2;
+                }
+                _p1[i-1] = prev_p1 + prev_p2;
+            }
+        }
+        RETURN (self);
     }
 %}.
     super primAddArray:floatArray
@@ -287,32 +290,32 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz1 = __floatArraySize(self);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float v;
-	float prev_p1;
+        INT _sz1 = __floatArraySize(self);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float v;
+        float prev_p1;
 
-	if (_sz1 > 0) {
-	    if (__isFloat(aScalar)) {
-		v = (float)(__floatVal(aScalar));
-	    } else  if (__isShortFloat(aScalar)) {
-		v = __shortFloatVal(aScalar);
-	    } else if (__isSmallInteger(aScalar)) {
-		v = (float)(__intVal(aScalar));
-	    } else
-		goto badArg;
+        if (_sz1 > 0) {
+            if (__isFloat(aScalar)) {
+                v = (float)(__floatVal(aScalar));
+            } else  if (__isShortFloat(aScalar)) {
+                v = __shortFloatVal(aScalar);
+            } else if (__isSmallInteger(aScalar)) {
+                v = (float)(__intVal(aScalar));
+            } else
+                goto badArg;
 
-	    /* how about inline-mmx-asm for this ... */
-	    prev_p1 = _p1[0];
-	    for (i=1; i<_sz1; i++) {
-		float next_p1 = _p1[i];
-		_p1[i-1] = prev_p1 + v;
-		prev_p1 = next_p1;
-	    }
-	    _p1[i-1] = prev_p1 + v;
-	}
-	RETURN (self);
+            /* how about inline-mmx-asm for this ... */
+            prev_p1 = _p1[0];
+            for (i=1; i<_sz1; i++) {
+                float next_p1 = _p1[i];
+                _p1[i-1] = prev_p1 + v;
+                prev_p1 = next_p1;
+            }
+            _p1[i-1] = prev_p1 + v;
+        }
+        RETURN (self);
     }
     badArg: ;
 %}.
@@ -339,29 +342,29 @@
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
      && __isFloats(floatArray)
      && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
-	INT _sz1 = __floatArraySize(self);
-	INT _sz2 = __floatArraySize(floatArray);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+        INT _sz1 = __floatArraySize(self);
+        INT _sz2 = __floatArraySize(floatArray);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
 
-	if (_sz1 > 0) {
-	    if (_sz2 >= _sz1) {
-		/* how about inline-mmx-asm for this ... */
-		float prev_p1 = _p1[0];
-		float prev_p2 = _p2[0];
+        if (_sz1 > 0) {
+            if (_sz2 >= _sz1) {
+                /* how about inline-mmx-asm for this ... */
+                float prev_p1 = _p1[0];
+                float prev_p2 = _p2[0];
 
-		for (i=1; i<_sz1; i++) {
-		    float next_p1 = _p1[i];
-		    float next_p2 = _p2[i];
-		    _p1[i-1] = prev_p1 / prev_p2;
-		    prev_p1 = next_p1;
-		    prev_p2 = next_p2;
-		}
-		_p1[i-1] = prev_p1 / prev_p2;
-	    }
-	}
-	RETURN (self);
+                for (i=1; i<_sz1; i++) {
+                    float next_p1 = _p1[i];
+                    float next_p2 = _p2[i];
+                    _p1[i-1] = prev_p1 / prev_p2;
+                    prev_p1 = next_p1;
+                    prev_p2 = next_p2;
+                }
+                _p1[i-1] = prev_p1 / prev_p2;
+            }
+        }
+        RETURN (self);
     }
 %}.
     super primDivArray: floatArray
@@ -383,32 +386,32 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz1 = __floatArraySize(self);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float v;
-	float prev_p1;
+        INT _sz1 = __floatArraySize(self);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float v;
+        float prev_p1;
 
-	if (_sz1 > 0) {
-	    if (__isFloat(aScalar)) {
-		v = (float)(__floatVal(aScalar));
-	    } else  if (__isShortFloat(aScalar)) {
-		v = __shortFloatVal(aScalar);
-	    } else if (__isSmallInteger(aScalar)) {
-		v = (float)(__intVal(aScalar));
-	    } else
-		goto badArg;
+        if (_sz1 > 0) {
+            if (__isFloat(aScalar)) {
+                v = (float)(__floatVal(aScalar));
+            } else  if (__isShortFloat(aScalar)) {
+                v = __shortFloatVal(aScalar);
+            } else if (__isSmallInteger(aScalar)) {
+                v = (float)(__intVal(aScalar));
+            } else
+                goto badArg;
 
-	    /* how about inline-mmx-asm for this ... */
-	    prev_p1 = _p1[0];
-	    for (i=1; i<_sz1; i++) {
-		float next_p1 = _p1[i];
-		_p1[i-1] = prev_p1 / v;
-		prev_p1 = next_p1;
-	    }
-	    _p1[i-1] = prev_p1 / v;
-	}
-	RETURN (self);
+            /* how about inline-mmx-asm for this ... */
+            prev_p1 = _p1[0];
+            for (i=1; i<_sz1; i++) {
+                float next_p1 = _p1[i];
+                _p1[i-1] = prev_p1 / v;
+                prev_p1 = next_p1;
+            }
+            _p1[i-1] = prev_p1 / v;
+        }
+        RETURN (self);
     }
     badArg: ;
 %}.
@@ -437,28 +440,28 @@
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
      && __isFloats(floatArray)
      && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
-	INT _sz1 = __floatArraySize(self);
-	INT _sz2 = __floatArraySize(floatArray);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+        INT _sz1 = __floatArraySize(self);
+        INT _sz2 = __floatArraySize(floatArray);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
 
-	if (_sz1 > 0) {
-	    if (_sz2 >= _sz1) {
-		float prev_p1 = _p1[0];
-		float prev_p2 = _p2[0];
+        if (_sz1 > 0) {
+            if (_sz2 >= _sz1) {
+                float prev_p1 = _p1[0];
+                float prev_p2 = _p2[0];
 
-		for (i=1; i<_sz1; i++) {
-		    float next_p1 = _p1[i];
-		    float next_p2 = _p2[i];
-		    _p1[i-1] = prev_p1 * prev_p2;
-		    prev_p1 = next_p1;
-		    prev_p2 = next_p2;
-		}
-		_p1[i-1] = prev_p1 * prev_p2;
-	    }
-	}
-	RETURN (self);
+                for (i=1; i<_sz1; i++) {
+                    float next_p1 = _p1[i];
+                    float next_p2 = _p2[i];
+                    _p1[i-1] = prev_p1 * prev_p2;
+                    prev_p1 = next_p1;
+                    prev_p2 = next_p2;
+                }
+                _p1[i-1] = prev_p1 * prev_p2;
+            }
+        }
+        RETURN (self);
     }
 %}.
     super primMulArray: floatArray
@@ -478,32 +481,32 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz1 = __floatArraySize(self);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float v;
-	float prev_p1;
+        INT _sz1 = __floatArraySize(self);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float v;
+        float prev_p1;
 
-	if (_sz1 > 0) {
-	    if (__isFloat(aScalar)) {
-		v = (float)(__floatVal(aScalar));
-	    } else  if (__isShortFloat(aScalar)) {
-		v = __shortFloatVal(aScalar);
-	    } else if (__isSmallInteger(aScalar)) {
-		v = (float)(__intVal(aScalar));
-	    } else
-		goto badArg;
+        if (_sz1 > 0) {
+            if (__isFloat(aScalar)) {
+                v = (float)(__floatVal(aScalar));
+            } else  if (__isShortFloat(aScalar)) {
+                v = __shortFloatVal(aScalar);
+            } else if (__isSmallInteger(aScalar)) {
+                v = (float)(__intVal(aScalar));
+            } else
+                goto badArg;
 
-	    /* how about inline-mmx-asm for this ... */
-	    prev_p1 = _p1[0];
-	    for (i=1; i<_sz1; i++) {
-		float next_p1 = _p1[i];
-		_p1[i-1] = prev_p1 * v;
-		prev_p1 = next_p1;
-	    }
-	    _p1[i-1] = prev_p1 * v;
-	}
-	RETURN (self);
+            /* how about inline-mmx-asm for this ... */
+            prev_p1 = _p1[0];
+            for (i=1; i<_sz1; i++) {
+                float next_p1 = _p1[i];
+                _p1[i-1] = prev_p1 * v;
+                prev_p1 = next_p1;
+            }
+            _p1[i-1] = prev_p1 * v;
+        }
+        RETURN (self);
     }
     badArg: ;
 %}.
@@ -527,23 +530,23 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
-	INT i;
-	float *_p = __FloatArrayInstPtr(self)->f_element;
-	float prev_p;
+        INT _sz = __floatArraySize(self);
+        INT i;
+        float *_p = __FloatArrayInstPtr(self)->f_element;
+        float prev_p;
 
-	if (_sz > 0) {
-	    /* how about inline-mmx-asm for this ... */
-	    prev_p = _p[0];
-	    for (i=1; i<_sz; i++) {
-		float next_p = _p[i];
+        if (_sz > 0) {
+            /* how about inline-mmx-asm for this ... */
+            prev_p = _p[0];
+            for (i=1; i<_sz; i++) {
+                float next_p = _p[i];
 
-		_p[i-1] = -prev_p;
-		prev_p = next_p;
-	    }
-	    _p[i-1] = -prev_p;
-	}
-	RETURN (self);
+                _p[i-1] = -prev_p;
+                prev_p = next_p;
+            }
+            _p[i-1] = -prev_p;
+        }
+        RETURN (self);
     }
 %}.
     super primNegated
@@ -567,28 +570,28 @@
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
      && __isFloats(floatArray)
      && (__ClassInstPtr(__qClass(floatArray))->c_ninstvars == __mkSmallInteger(0))) {
-	INT _sz1 = __floatArraySize(self);
-	INT _sz2 = __floatArraySize(floatArray);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
+        INT _sz1 = __floatArraySize(self);
+        INT _sz2 = __floatArraySize(floatArray);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float *_p2 = __FloatArrayInstPtr(floatArray)->f_element;
 
-	if (_sz1 > 0) {
-	    if (_sz2 >= _sz1) {
-		float prev_p1 = _p1[0];
-		float prev_p2 = _p2[0];
+        if (_sz1 > 0) {
+            if (_sz2 >= _sz1) {
+                float prev_p1 = _p1[0];
+                float prev_p2 = _p2[0];
 
-		for (i=1; i<_sz1; i++) {
-		    float next_p1 = _p1[i];
-		    float next_p2 = _p2[i];
-		    _p1[i-1] = prev_p1 - prev_p2;
-		    prev_p1 = next_p1;
-		    prev_p2 = next_p2;
-		}
-		_p1[i-1] = prev_p1 - prev_p2;
-	    }
-	}
-	RETURN (self);
+                for (i=1; i<_sz1; i++) {
+                    float next_p1 = _p1[i];
+                    float next_p2 = _p2[i];
+                    _p1[i-1] = prev_p1 - prev_p2;
+                    prev_p1 = next_p1;
+                    prev_p2 = next_p2;
+                }
+                _p1[i-1] = prev_p1 - prev_p2;
+            }
+        }
+        RETURN (self);
     }
 %}.
     super primSubtractArray: floatArray
@@ -610,32 +613,32 @@
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz1 = __floatArraySize(self);
-	INT i;
-	float *_p1 = __FloatArrayInstPtr(self)->f_element;
-	float v;
-	float prev_p1;
+        INT _sz1 = __floatArraySize(self);
+        INT i;
+        float *_p1 = __FloatArrayInstPtr(self)->f_element;
+        float v;
+        float prev_p1;
 
-	if (_sz1 > 0) {
-	    if (__isFloat(aScalar)) {
-		v = (float)(__floatVal(aScalar));
-	    } else  if (__isShortFloat(aScalar)) {
-		v = __shortFloatVal(aScalar);
-	    } else if (__isSmallInteger(aScalar)) {
-		v = (float)(__intVal(aScalar));
-	    } else
-		goto badArg;
+        if (_sz1 > 0) {
+            if (__isFloat(aScalar)) {
+                v = (float)(__floatVal(aScalar));
+            } else  if (__isShortFloat(aScalar)) {
+                v = __shortFloatVal(aScalar);
+            } else if (__isSmallInteger(aScalar)) {
+                v = (float)(__intVal(aScalar));
+            } else
+                goto badArg;
 
-	    /* how about inline-mmx-asm for this... ? */
-	    prev_p1 = _p1[0];
-	    for (i=1; i<_sz1; i++) {
-		float next_p1 = _p1[i];
-		_p1[i-1] = prev_p1 - v;
-		prev_p1 = next_p1;
-	    }
-	    _p1[i-1] = prev_p1 - v;
-	}
-	RETURN (self);
+            /* how about inline-mmx-asm for this... ? */
+            prev_p1 = _p1[0];
+            for (i=1; i<_sz1; i++) {
+                float next_p1 = _p1[i];
+                _p1[i-1] = prev_p1 - v;
+                prev_p1 = next_p1;
+            }
+            _p1[i-1] = prev_p1 - v;
+        }
+        RETURN (self);
     }
     badArg: ;
 %}.
@@ -668,163 +671,69 @@
     ^ anObject isNumber
 !
 
-max
-    "return the largest element;
-     redefined for speed"
-%{
-    if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
-
-	if (_sz > 0) {
-	    float *_p = __FloatArrayInstPtr(self)->f_element;
-	    float _max;
-
-	    _max = _p[0];
-	    if (_sz > 1) {
-		INT _i;
-		float _prev, _this;
-
-		/* how about inline-mmx-asm for this ... */
-		_this = _p[1];
-		for (_i=2; _i<_sz; _i++) {
-		    _prev = _this;
-		    _this = _p[_i];
-		    if (_prev > _max) _max = _prev;
-		}
-		if (_this > _max) _max = _this;
-	    }
-	    RETURN (__MKFLOAT(_max));
-	}
-    }
-%}.
-    ^ super max
-
-    "
-     |f1|
-
-     f1 := (1 to:1000) asFloatArray.
-     Time millisecondsToRun:[ 1000 timesRepeat:[ f1 max ] ]
-    "
-    "
-     |f1|
-
-     f1 := FloatArray withAll:#(1 2 3 4 5).
-     f1 max
-    "
-    "
-     |f1|
-
-     f1 := FloatArray withAll:#(5 4 3 2 1).
-     f1 max
-    "
-!
-
-min
-    "return the smallest element;
-     redefined for speed"
-%{
-    if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
-
-	if (_sz > 0) {
-	    float *_p = __FloatArrayInstPtr(self)->f_element;
-	    float _min;
-
-	    _min = _p[0];
-	    if (_sz > 1) {
-		INT _i;
-		float _prev, _this;
-
-		/* how about inline-mmx-asm for this ... */
-		_this = _p[1];
-		for (_i=2; _i<_sz; _i++) {
-		    _prev = _this;
-		    _this = _p[_i];
-		    if (_prev < _min) _min = _prev;
-		}
-		if (_this < _min) _min = _this;
-	    }
-	    RETURN (__MKFLOAT(_min));
-	}
-    }
-%}.
-    ^ super min
-
-    "
-     |f1|
-
-     f1 := (1 to:1000) asFloatArray.
-     Time millisecondsToRun:[ 1000 timesRepeat:[ f1 min ] ]
-    "
-    "
-     |f1|
-
-     f1 := FloatArray withAll:#(1 2 3 4 5).
-     f1 min
-    "
-    "
-     |f1|
-
-     f1 := FloatArray withAll:#(5 4 3 2 1).
-     f1 min
-    "
-!
-
 minMax
     "return a Tuple holding the smallest and largest element;
      redefined for speed"
 
-    |min max|
+    |min max empty|
 
 %{
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT _sz = __floatArraySize(self);
-	if (_sz > 0) {
-	    INT _i;
-	    float *_p = __FloatArrayInstPtr(self)->f_element;
-	    float _min, _max;
-
-	    _min = _max = _p[0];
+        INT _sz = __floatArraySize(self);
+        
+        if (_sz > 0) {
+            INT _i;
+            float *_p = __FloatArrayInstPtr(self)->f_element;
+            float _min, _max;
+            OBJ retVal;
+            
+            _min = _max = _p[0];
 #ifdef PRE_4_OCT_2011
-	    if (_sz > 1) {
-		float _this = _p[1];
-		float _prev;
+            if (_sz > 1) {
+                float _this = _p[1];
+                float _prev;
 
-		/* how about inline-mmx-asm for this ... */
-		for (_i=2; _i<_sz; _i++) {
-		    _prev = _this;
-		    _this = _p[_i];
-		    if (_prev < _min) {
-			_min = _prev;
-		    } else if (_prev > _max) {
-			_max = _prev;
-		    }
-		}
-		if (_this < _min) {
-		    _min = _this;
-		} else if (_this > _max) {
-		    _max = _this;
-		}
-	    }
+                /* how about inline-mmx-asm for this ... */
+                for (_i=2; _i<_sz; _i++) {
+                    _prev = _this;
+                    _this = _p[_i];
+                    if (_prev < _min) {
+                        _min = _prev;
+                    } else if (_prev > _max) {
+                        _max = _prev;
+                    }
+                }
+                if (_this < _min) {
+                    _min = _this;
+                } else if (_this > _max) {
+                    _max = _this;
+                }
+            }
 #else
-	    for (_i=_sz-1; _i>0; _i-=2) {
-		float _v1 = _p[_i];
-		float _v2 = _p[_i-1];
-		if (_v1 < _v2) {
-		    if (_v1 < _min) _min = _v1;
-		    if (_v2 > _max) _max = _v2;
-		} else {
-		    if (_v2 < _min) _min = _v2;
-		    if (_v1 > _max) _max = _v1;
-		}
-	    }
+            for (_i=_sz-1; _i>0; _i-=2) {
+                float _v1 = _p[_i];
+                float _v2 = _p[_i-1];
+                if (_v1 < _v2) {
+                    if (_v1 < _min) _min = _v1;
+                    if (_v2 > _max) _max = _v2;
+                } else {
+                    if (_v2 < _min) _min = _v2;
+                    if (_v1 > _max) _max = _v1;
+                }
+            }
 #endif
-	    min = __MKFLOAT(_min);
-	    max = __MKFLOAT(_max);
-	    RETURN (__ARRAY_WITH2(min, max));
-	}
+            min = __MKFLOAT(_min);
+            __PROTECT__(min);
+            max = __MKFLOAT(_max);
+            __UNPROTECT__(min);
+            RETURN (__ARRAY_WITH2(min, max));
+        }
+        empty = true;
     }
 %}.
+    empty == true ifTrue:[
+        ^ self emptyCollectionError.
+    ].
     ^ Array with:(super min) with:(super max)
 
     "
@@ -842,6 +751,12 @@
     "
      |f1|
 
+     f1 := FloatArray withAll:#(1 2 3 4).
+     f1 minMax
+    "
+    "
+     |f1|
+
      f1 := FloatArray withAll:#(5 4 3 2 1).
      f1 minMax
     "
@@ -865,37 +780,37 @@
 %{
     if ((__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0))
      && (__ClassInstPtr(__qClass(aFloatVector))->c_ninstvars == __mkSmallInteger(0))) {
-	INT __mySize = __floatArraySize(self);
-	double __result = 0.0;
-	float *__p1 = __FloatArrayInstPtr(self)->f_element;
+        INT __mySize = __floatArraySize(self);
+        double __result = 0.0;
+        float *__p1 = __FloatArrayInstPtr(self)->f_element;
 
-	if (__mySize > 0) {
-	    if (__isFloats(aFloatVector)) {
-		INT __otherSize = __floatArraySize(aFloatVector);
+        if (__mySize > 0) {
+            if (__isFloats(aFloatVector)) {
+                INT __otherSize = __floatArraySize(aFloatVector);
 
-		if (__mySize == __otherSize) {
-		    float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element;
-		    INT __i;
-		    /* how about inline-mmx-asm for this ... */
-		    for (__i=0; __i<__mySize; __i++) {
-			__result += (__p1[__i] * __p2[__i]);
-		    }
-		    RETURN (__MKFLOAT(__result));
-		}
-	    } else if (__isDoubles(aFloatVector)) {
-		INT __otherSize = __doubleArraySize(aFloatVector);
+                if (__mySize == __otherSize) {
+                    float *__p2 = __FloatArrayInstPtr(aFloatVector)->f_element;
+                    INT __i;
+                    /* how about inline-mmx-asm for this ... */
+                    for (__i=0; __i<__mySize; __i++) {
+                        __result += (__p1[__i] * __p2[__i]);
+                    }
+                    RETURN (__MKFLOAT(__result));
+                }
+            } else if (__isDoubles(aFloatVector)) {
+                INT __otherSize = __doubleArraySize(aFloatVector);
 
-		if (__mySize == __otherSize) {
-		    double *__p2 = __DoubleArrayInstPtr(aFloatVector)->d_element;
-		    INT __i;
-		    /* how about inline-mmx-asm for this ... */
-		    for (__i=0; __i<__mySize; __i++) {
-			__result += (__p1[__i] * __p2[__i]);
-		    }
-		    RETURN (__MKFLOAT(__result));
-		}
-	    }
-	}
+                if (__mySize == __otherSize) {
+                    double *__p2 = __DoubleArrayInstPtr(aFloatVector)->d_element;
+                    INT __i;
+                    /* how about inline-mmx-asm for this ... */
+                    for (__i=0; __i<__mySize; __i++) {
+                        __result += (__p1[__i] * __p2[__i]);
+                    }
+                    RETURN (__MKFLOAT(__result));
+                }
+            }
+        }
     }
 %}.
     ^ super dot:aFloatVector
@@ -950,9 +865,9 @@
      v1 := Array new:10000 withAll:2.
      v2 := Array new:10000 withAll:3.
      Time millisecondsToRun:[
-	10000 timesRepeat:[
-	  v1 dot:v2.
-	]
+        10000 timesRepeat:[
+          v1 dot:v2.
+        ]
      ]
     "
     "
@@ -961,9 +876,9 @@
      v1 := FloatArray new:10000 withAll:2.
      v2 := FloatArray new:10000 withAll:3.
      Time millisecondsToRun:[
-	10000 timesRepeat:[
-	  v1 dot:v2.
-	]
+        10000 timesRepeat:[
+          v1 dot:v2.
+        ]
      ]
     "
 
@@ -981,7 +896,7 @@
 hornerMultiplyAndAdd:x
     "primitive support for horner's-method computation of polynomials.
      The vector is interpreted as providing the factors for a polynomial,
-	an*x^n + (an-1)*x^(n-1) + ... + a2(x) + a1
+        an*x^n + (an-1)*x^(n-1) + ... + a2(x) + a1
      where the ai are the elements of the Array.
      The highest rank factor is at the first position, the 0-rank constant at last.
      This is inlined c-code, which may get compiled to fast machine code,
@@ -993,28 +908,28 @@
     double __x;
 
     if (__isFloat(x)) {
-	__x = __floatVal(x);
+        __x = __floatVal(x);
     } else if (__isShortFloat(x)) {
-	__x = (double)__shortFloatVal(x);
+        __x = (double)__shortFloatVal(x);
     } else if (__isSmallInteger(x)) {
-	__x = (double)(__intVal(x));
+        __x = (double)(__intVal(x));
     } else {
-	goto getOutOfHere;
+        goto getOutOfHere;
     }
 
     if (__ClassInstPtr(__qClass(self))->c_ninstvars == __mkSmallInteger(0)) {
-	INT __mySize = __floatArraySize(self);
-	float *__elements = __FloatArrayInstPtr(self)->f_element;
-	double __result = __elements[0];
+        INT __mySize = __floatArraySize(self);
+        float *__elements = __FloatArrayInstPtr(self)->f_element;
+        double __result = __elements[0];
 
-	if (__mySize > 1) {
-	    INT __i;
-	    /* how about inline-mmx-asm for this ... */
-	    for (__i=1; __i<__mySize; __i++) {
-		__result = (__result * __x) + __elements[__i];
-	    }
-	}
-	RETURN (__MKFLOAT(__result));
+        if (__mySize > 1) {
+            INT __i;
+            /* how about inline-mmx-asm for this ... */
+            for (__i=1; __i<__mySize; __i++) {
+                __result = (__result * __x) + __elements[__i];
+            }
+        }
+        RETURN (__MKFLOAT(__result));
     }
 getOutOfHere: ;
 %}.
@@ -1036,23 +951,24 @@
      |v|
      v := Array new:100 withAll:2.0.
      Time millisecondsToRun:[
-	10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+        10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
      ]
 
      |v|
      v := FloatArray new:100 withAll:2.
      Time millisecondsToRun:[
-	10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+        10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
      ]
 
      |v|
      v := DoubleArray new:100 withAll:2.
      Time millisecondsToRun:[
-	10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
+        10000 timesRepeat:[ v hornerMultiplyAndAdd:10]
      ]
     "
 ! !
 
+
 !FloatArray class methodsFor:'documentation'!
 
 version