]> git.tuebingen.mpg.de Git - paraslash.git/commitdiff
Merge branch 't/array_size'
authorAndre Noll <maan@systemlinux.org>
Sat, 5 Mar 2011 11:54:28 +0000 (12:54 +0100)
committerAndre Noll <maan@systemlinux.org>
Sat, 5 Mar 2011 11:54:28 +0000 (12:54 +0100)
1  2 
para.h

diff --combined para.h
index f095a6aa385d2f717048f1e25e15741a15632617,c30e4710ee7ff9b2d725dee06b7ec4a378e1c820..29c5c2b89c4ac3e0ca820c26c07cd8be4755f266
--- 1/para.h
--- 2/para.h
+++ b/para.h
@@@ -165,23 -165,28 +165,38 @@@ _static_inline_ long int para_random(un
        return ((max + 0.0) * (random() / (RAND_MAX + 1.0)));
  }
  
 +/** Round up x to next multiple of y. */
 +#define ROUND_UP(x, y) ({ \
 +      const typeof(y) _divisor = y; \
 +      ((x) + _divisor - 1) / _divisor * _divisor; })
 +
 +/** Round down x to multiple of y. */
 +#define ROUND_DOWN(x, y) ({ \
 +      const typeof(y) _divisor = y; \
 +      (x) / _divisor * _divisor; })
 +
  /** Divide and round up to next integer. */
  #define DIV_ROUND_UP(x, y) ({ \
        typeof(y) _divisor = y; \
        ((x) + _divisor - 1) / _divisor; })
  
+ /**
+  * Assert a build-time dependency, as an expression.
+  *
+  * \param cond The compile-time condition which must be true.
+  *
+  * Compilation will fail if the condition isn't true, or can't be evaluated by
+  * the compiler. This can be used in an expression: its value is "0".
+  *
+  * Taken from ccan.
+  */
+ #define EXPR_BUILD_ASSERT(cond) (sizeof(char [1 - 2 * !(cond)]) - 1)
+ /* &a[0] degrades to a pointer: a different type from an array */
+ #define _array_size_chk(arr) EXPR_BUILD_ASSERT(\
+       !__builtin_types_compatible_p(typeof(arr), typeof(&(arr)[0])))
  /** Get the size of an array */
- #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
+ #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]) + _array_size_chk(arr))
  
  /**
   * Wrapper for isspace.