#ifndef JEMALLOC_INTERNAL_DECLS_H
#define JEMALLOC_INTERNAL_DECLS_H

#include <math.h>
#ifdef _WIN32
#	include <windows.h>
#	include "msvc_compat/windows_extra.h"
#	include "msvc_compat/strings.h"
#	ifdef _WIN64
#		if LG_VADDR <= 32
#			error Generate the headers using x64 vcargs
#		endif
#	else
#		if LG_VADDR > 32
#			undef LG_VADDR
#			define LG_VADDR 32
#		endif
#	endif
#else
#	include <sys/param.h>
#	include <sys/mman.h>
#	if !defined(__pnacl__) && !defined(__native_client__)
#		include <sys/syscall.h>
#		if !defined(SYS_write) && defined(__NR_write)
#			define SYS_write __NR_write
#		endif
#		if defined(SYS_open) && defined(__aarch64__)
/* Android headers may define SYS_open to __NR_open even though
        * __NR_open may not exist on AArch64 (superseded by __NR_openat). */
#			undef SYS_open
#		endif
#		include <sys/uio.h>
#	endif
#	include <pthread.h>
#	if defined(__FreeBSD__) || defined(__DragonFly__)                     \
	    || defined(__OpenBSD__)
#		include <pthread_np.h>
#		include <sched.h>
#		if defined(__FreeBSD__)
#			define cpu_set_t cpuset_t
#		endif
#	endif
#	include <signal.h>
#	ifdef JEMALLOC_OS_UNFAIR_LOCK
#		include <os/lock.h>
#	endif
#	ifdef JEMALLOC_GLIBC_MALLOC_HOOK
#		include <sched.h>
#	endif
#	include <errno.h>
#	include <sys/time.h>
#	include <time.h>
#	ifdef JEMALLOC_HAVE_MACH_ABSOLUTE_TIME
#		include <mach/mach_time.h>
#	endif
#endif
#include <sys/types.h>

#include <limits.h>
#ifndef SIZE_T_MAX
#	define SIZE_T_MAX SIZE_MAX
#endif
#ifndef SSIZE_MAX
#	define SSIZE_MAX ((ssize_t)(SIZE_T_MAX >> 1))
#endif
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stddef.h>
#ifndef offsetof
#	define offsetof(type, member) ((size_t) & (((type *)NULL)->member))
#endif
#include <string.h>
#include <strings.h>
#include <ctype.h>
#ifdef _MSC_VER
#	include <io.h>
typedef intptr_t ssize_t;
#	define PATH_MAX 1024
#	define STDERR_FILENO 2
#	define __func__ __FUNCTION__
#	ifdef JEMALLOC_HAS_RESTRICT
#		define restrict __restrict
#	endif
/* Disable warnings about deprecated system functions. */
#	pragma warning(disable : 4996)
#	if _MSC_VER < 1800
static int
isblank(int c) {
	return (c == '\t' || c == ' ');
}
#	endif
#else
#	include <unistd.h>
#endif
#include <fcntl.h>

/*
 * The Win32 midl compiler has #define small char; we don't use midl, but
 * "small" is a nice identifier to have available when talking about size
 * classes.
 */
#ifdef small
#	undef small
#endif

/*
 * Oftentimes we'd like to perform some kind of arithmetic to obtain
 * a pointer from another pointer but with some offset or mask applied.
 * Naively you would accomplish this by casting the source pointer to
 * `uintptr_t`, performing all of the relevant arithmetic, and then casting
 * the result to the desired pointer type. However, this has the unfortunate
 * side-effect of concealing pointer provenance, hiding useful information for
 * optimization from the compiler (see here for details:
 * https://clang.llvm.org/extra/clang-tidy/checks/performance/no-int-to-ptr.html
 * )
 * Instead what one should do is cast the source pointer to `char *` and perform
 * the equivalent arithmetic (since `char` of course represents one byte). But
 * because `char *` has the semantic meaning of "string", we define this typedef
 * simply to make it clearer where we are performing such pointer arithmetic.
 */
typedef char byte_t;

#endif /* JEMALLOC_INTERNAL_H */
