+/* avr-gcc does not seem to support libstdc++ */
+#if defined(__cplusplus) && !CPU_AVR
+ /* Type-generic macros implemented with template functions. */
+ #include <algorithm>
+
+ template<class T> inline T ABS(T n) { return n >= 0 ? n : -n; }
+ #define MIN(a,b) std::min(a, b)
+ #define MAX(a,b) std::max(a, b)
+ #define SWAP(a,b) std::swap(a, b)
+#elif (COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF)
+ /* Type-generic macros implemented with statement expressions. */
+ #define ABS(n) ({ \
+ __typeof__(n) _n = (n); \
+ (_n < 0) ? -_n : _n; \
+ })
+ #define MIN(a,b) ({ \
+ __typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ (void)(&_a == &_b); /* ensure same type */ \
+ (_a < _b) ? _a : _b; \
+ })
+ #define MAX(a,b) ({ \
+ __typeof__(a) _a = (a); \
+ __typeof__(b) _b = (b); \
+ (void)(&_a == &_b); /* ensure same type */ \
+ (_a > _b) ? _a : _b; \
+ })
+#else /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */
+ /* Buggy macros for inferior compilers. */
+ #define ABS(a) (((a) < 0) ? -(a) : (a))
+ #define MIN(a,b) (((a) < (b)) ? (a) : (b))
+ #define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif /* !(COMPILER_STATEMENT_EXPRESSIONS && COMPILER_TYPEOF) */
+
+/*! Bound \a x between \a min and \a max. */
+#define MINMAX(min,x,max) (MIN(MAX(min, x), max))
+
+#ifdef __cplusplus
+ /* Use standard implementation from <algorithm> */
+ #define SWAP(a,b) std::swap(a, b)
+#elif COMPILER_TYPEOF
+ /*!
+ * Type-generic macro to swap \a a with \a b.
+ *
+ * \note Arguments are evaluated multiple times.
+ */
+ #define SWAP(a, b) \
+ do { \
+ (void)(&(a) == &(b)); /* type check */ \
+ typeof(a) tmp; \
+ tmp = (a); \
+ (a) = (b); \
+ (b) = tmp; \
+ } while (0)
+#else /* !COMPILER_TYPEOF */
+ /* Sub-optimal implementation that only works with integral types. */
+ #define SWAP(a, b) ((a) ^= (b) ^= (a) ^= (b))
+#endif /* COMPILER_TYPEOF */