#ifndef _FUTILS_H_
#define _FUTILS_H_
#define FUTILS_SIZEOF_ARRAY(x) (sizeof((x)) / sizeof((x)[0]))
#ifndef SIZEOF_ARRAY
#define SIZEOF_ARRAY(x) FUTILS_SIZEOF_ARRAY(x)
#endif
#define FUTILS_STRINGIFY(x) #x
#define FUTILS_TOSTRING(x) FUTILS_STRINGIFY(x)
#ifndef TOSTRING
#define TOSTRING(x) FUTILS_TOSTRING(x)
#endif
#define FUTILS_MIN(a, b) \
({ __typeof__(a) _a = (a); __typeof__(b) _b = (b); _a < _b ? _a : _b; })
#ifndef MIN
#define MIN(a, b) FUTILS_MIN(a, b)
#endif
#define FUTILS_MAX(a, b) \
({ __typeof__(a) _a = (a); __typeof__(b) _b = (b); _a > _b ? _a : _b; })
#ifndef MAX
#define MAX(a, b) FUTILS_MAX(a, b)
#endif
#define FUTILS_BOUND(a, m, M) \
({ __typeof__(a) _a = (a); __typeof__(m) _m = (m); \
__typeof__(M) _M = (M); _a < _m ? _m : _a > _M ? _M : _a; })
#ifndef BOUND
#define BOUND(a, m, M) FUTILS_BOUND(a, m, M)
#endif
#ifdef __COVERITY__
# define FUTILS_STATIC_ASSERT(x, msg)
#elif __STDC_VERSION__ >= 201112L
# include <assert.h>
# define FUTILS_STATIC_ASSERT(x, msg) \
static_assert(x, msg)
#else
# define FUTILS_STATIC_ASSERT(x, msg) \
\
typedef char __STATIC_ASSERT__[(x) ? 1 : -1]
#endif
#ifndef STATIC_ASSERT
#define STATIC_ASSERT(x, msg) FUTILS_STATIC_ASSERT(x, msg)
#endif
#ifndef FUTILS_ATTRIBUTE_FORMAT_PRINTF
# if defined(__GNUC__) && defined(__MINGW32__) && !defined(__clang__)
# define FUTILS_ATTRIBUTE_FORMAT_PRINTF(_x, _y) \
__attribute__((__format__(__gnu_printf__, _x, _y)))
# elif defined(__GNUC__)
# define FUTILS_ATTRIBUTE_FORMAT_PRINTF(_x, _y) \
__attribute__((__format__(__printf__, _x, _y)))
# else
# define FUTILS_ATTRIBUTE_FORMAT_PRINTF(_x, _y)
# endif
#endif
#include <futils/fdutils.h>
#include <futils/hash.h>
#include <futils/list.h>
#include <futils/timetools.h>
#include <futils/systimetools.h>
#include <futils/synctools.h>
#include <futils/mbox.h>
#include <futils/dynmbox.h>
#include <futils/random.h>
#include <futils/varint.h>
#include <futils/safew.h>
#include <futils/string.h>
#include <futils/futils.hpp>
#endif