1#ifndef HASHLIB_ALL_IN_ONE
4#if __has_include(<version>)
10#define HASHLIB_VERSION "1.1.1"
13#define HASHLIB_CXX_STANDARD _MSVC_LANG
15#define HASHLIB_CXX_STANDARD __cplusplus
18#define HASHLIB_CXX_STD98 199711L
19#define HASHLIB_CXX_STD11 201103L
20#define HASHLIB_CXX_STD14 201402L
21#define HASHLIB_CXX_STD17 201703L
22#define HASHLIB_CXX_STD20 202002L
23#define HASHLIB_CXX_STD23 202302L
25#if HASHLIB_CXX_STANDARD < HASHLIB_CXX_STD11
26#error "hashlib requires a C++11 compiler."
30#define HASHLIB_CXX_COMPILER_CLANG 1
31#define HASHLIB_CXX_COMPILER_GCC 0
32#define HASHLIB_CXX_COMPILER_MSVC 0
33#elif defined(__GNUC__)
34#define HASHLIB_CXX_COMPILER_CLANG 0
35#define HASHLIB_CXX_COMPILER_GCC 1
36#define HASHLIB_CXX_COMPILER_MSVC 0
37#elif defined(_MSC_VER)
38#define HASHLIB_CXX_COMPILER_CLANG 0
39#define HASHLIB_CXX_COMPILER_GCC 0
40#define HASHLIB_CXX_COMPILER_MSVC 1
42#error "hashlib requires the C++ compiler is clang, gcc or msvc."
45#if HASHLIB_CXX_COMPILER_CLANG
46#define HASHLIB_ALWAYS_INLINE [[clang::always_inline]]
47#elif HASHLIB_CXX_COMPILER_GCC
48#define HASHLIB_ALWAYS_INLINE [[gnu::always_inline]]
49#elif HASHLIB_CXX_COMPILER_MSVC
50#define HASHLIB_ALWAYS_INLINE [[msvc::forceinline]]
53#ifdef HASHLIB_BUILD_MODULE
54#define HASHLIB_MOD_EXPORT export
55#define HASHLIB_MOD_EXPORT_BEGIN export {
56#define HASHLIB_MOD_EXPORT_END }
58#define HASHLIB_MOD_EXPORT
59#define HASHLIB_MOD_EXPORT_BEGIN
60#define HASHLIB_MOD_EXPORT_END
63#if HASHLIB_CXX_STANDARD >= HASHLIB_CXX_STD17
64#define HASHLIB_CXX17_CONSTEXPR constexpr
66#define HASHLIB_CXX17_CONSTEXPR
69#if HASHLIB_CXX_STANDARD >= HASHLIB_CXX_STD20
70#define HASHLIB_CXX20_CONSTEXPR constexpr
72#define HASHLIB_CXX20_CONSTEXPR
75#if HASHLIB_CXX_STANDARD >= HASHLIB_CXX_STD17
76#define HASHLIB_CXX17_INLINE inline
78#define HASHLIB_CXX17_INLINE
81#ifdef __has_cpp_attribute
82#if __has_cpp_attribute(nodiscard)
83#define HASHLIB_NODISCARD [[nodiscard]]
85#define HASHLIB_NODISCARD
88#define HASHLIB_NODISCARD