Add macro for shuffling an array.
[bertos.git] / bertos / cfg / macros.h
index 1006fc42e6ac9cfee30ce838aeb04a7953933b4f..abf2057d5308d43d56593d60d0d8ed2c642ac5c4 100644 (file)
@@ -33,7 +33,7 @@
  * \brief Common and handy function macros
  *
  * \version $Id$
- * \author Bernardo Innocenti <bernie@develer.com>
+ * \author Bernie Innocenti <bernie@codewiz.org>
  * \author Giovanni Bajo <rasky@develer.com>
  */
 #ifndef CFG_MACROS_H
@@ -68,8 +68,8 @@
                 * were mixed in an expression. \
                 * Even in _a and _b are of the same type, \
                 * if mixed in an expression the type will be \
-                * promoted to int! \
-               */ \
+                * (at least) promoted to int! \
+                */ \
                ((typeof(_a))((_a < _b) ? _a : _b)); \
        })
        #define MAX(a,b) ({ \
@@ -84,8 +84,8 @@
                 * were mixed in an expression. \
                 * Even in _a and _b are of the same type, \
                 * if mixed in an expression the type will be \
-                * promoted to int! \
-               */ \
+                * (at least) promoted to int! \
+                */ \
                ((typeof(_a))((_a > _b) ? _a : _b)); \
        })
 #else /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */
 
 #endif /* COMPILER_TYPEOF */
 
+/**
+ * Shuffle the content of \a array that counts \a len elements.
+ */
+#define SHUFFLE(array, len) \
+       do { \
+               int i, j; \
+               for (i = (len) - 1; i > 0; i--) \
+               { \
+                       j = ((i + 1) * (rand() / (RAND_MAX + 1.0))); \
+                       SWAP((array)[i], (array)[j]); \
+               } \
+       } while (0)
+
 /**
  * Macro to swap \a a with \a b, with explicit type \a T for dumb C89 compilers.
  *
 /** Round up \a x to an even multiple of the 2's power \a pad. */
 #define ROUND_UP2(x, pad) (((x) + ((pad) - 1)) & ~((pad) - 1))
 
-/* OBSOLETE */
-#define ROUND2 ROUND_UP2
-
 /**
  * \name Integer round macros.
  *