#ifndef CRIMP_COMMON_H
#define CRIMP_COMMON_H
/*
 * CRIMP :: Common Declarations :: PUBLIC
 * (C) 2011.
 */

#define CRIMP_RANGEOK(i,n) ((0 <= (i)) && (i < (n)))

/*
 * Convenient checking of image types.
 */

#define CRIMP_ASSERT_IMGTYPE(image,imtype) \
    CRIMP_ASSERT ((image)->itype == crimp_imagetype_find ("crimp::image::" CRIMP_STR(imtype)), \
	    "expected image type " CRIMP_STR(imtype))

#define CRIMP_ASSERT_NOTIMGTYPE(image,imtype) \
    CRIMP_ASSERT ((image)->itype != crimp_imagetype_find ("crimp::image::" CRIMP_STR(imtype)), \
	    "unexpected image type " CRIMP_STR(imtype))

/*
 * Assertions support in general, and asserting the proper range of an array
 * index especially.
 */

#undef  CRIMP_DEBUG   /* Future: controlled by a user-specified critcl option */
#define CRIMP_DEBUG 1 /* */

#ifdef CRIMP_DEBUG
#define CRIMP_XSTR(x) #x
#define CRIMP_STR(x) CRIMP_XSTR(x)
#define CRIMP_ASSERT(x,msg) if (!(x)) { Tcl_Panic (msg " (" #x "), in file " __FILE__ " @line " CRIMP_STR(__LINE__));}
#define CRIMP_ASSERT_BOUNDS(i,n) CRIMP_ASSERT (CRIMP_RANGEOK(i,n),"array index out of bounds: " CRIMP_STR(i) " > " CRIMP_STR(n))
#else
#define CRIMP_ASSERT(x,msg)
#define CRIMP_ASSERT_BOUNDS(i,n)
#endif

/*
 * Heap allocation helpers.
 */

#define CRIMP_ALLOC(type)         ((type *) ckalloc (sizeof (type)))
#define CRIMP_ALLOC_ARRAY(n,type) ((type *) ckalloc ((n) * sizeof (type)))


/*
 * Local Variables:
 * mode: c
 * c-basic-offset: 4
 * fill-column: 78
 * End:
 */
#endif /* CRIMP_COMMON_H */
