diff options
author | Devtools Arcadia <arcadia-devtools@yandex-team.ru> | 2022-02-07 18:08:42 +0300 |
---|---|---|
committer | Devtools Arcadia <arcadia-devtools@mous.vla.yp-c.yandex.net> | 2022-02-07 18:08:42 +0300 |
commit | 1110808a9d39d4b808aef724c861a2e1a38d2a69 (patch) | |
tree | e26c9fed0de5d9873cce7e00bc214573dc2195b7 /util/system/defaults.h | |
download | ydb-1110808a9d39d4b808aef724c861a2e1a38d2a69.tar.gz |
intermediate changes
ref:cde9a383711a11544ce7e107a78147fb96cc4029
Diffstat (limited to 'util/system/defaults.h')
-rw-r--r-- | util/system/defaults.h | 155 |
1 files changed, 155 insertions, 0 deletions
diff --git a/util/system/defaults.h b/util/system/defaults.h new file mode 100644 index 0000000000..dcd7abea38 --- /dev/null +++ b/util/system/defaults.h @@ -0,0 +1,155 @@ +#pragma once + +#include "platform.h" + +#if defined _unix_ + #define LOCSLASH_C '/' + #define LOCSLASH_S "/" +#else + #define LOCSLASH_C '\\' + #define LOCSLASH_S "\\" +#endif // _unix_ + +#if defined(__INTEL_COMPILER) && defined(__cplusplus) + #include <new> +#endif + +// low and high parts of integers +#if !defined(_win_) + #include <sys/param.h> +#endif + +#if defined(BSD) || defined(_android_) + + #if defined(BSD) + #include <machine/endian.h> + #endif + + #if defined(_android_) + #include <endian.h> + #endif + + #if (BYTE_ORDER == LITTLE_ENDIAN) + #define _little_endian_ + #elif (BYTE_ORDER == BIG_ENDIAN) + #define _big_endian_ + #else + #error unknown endian not supported + #endif + +#elif (defined(_sun_) && !defined(__i386__)) || defined(_hpux_) || defined(WHATEVER_THAT_HAS_BIG_ENDIAN) + #define _big_endian_ +#else + #define _little_endian_ +#endif + +// alignment +#if (defined(_sun_) && !defined(__i386__)) || defined(_hpux_) || defined(__alpha__) || defined(__ia64__) || defined(WHATEVER_THAT_NEEDS_ALIGNING_QUADS) + #define _must_align8_ +#endif + +#if (defined(_sun_) && !defined(__i386__)) || defined(_hpux_) || defined(__alpha__) || defined(__ia64__) || defined(WHATEVER_THAT_NEEDS_ALIGNING_LONGS) + #define _must_align4_ +#endif + +#if (defined(_sun_) && !defined(__i386__)) || defined(_hpux_) || defined(__alpha__) || defined(__ia64__) || defined(WHATEVER_THAT_NEEDS_ALIGNING_SHORTS) + #define _must_align2_ +#endif + +#if defined(__GNUC__) + #define alias_hack __attribute__((__may_alias__)) +#endif + +#ifndef alias_hack + #define alias_hack +#endif + +#include "types.h" + +#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L) + #define PRAGMA(x) _Pragma(#x) + #define RCSID(idstr) PRAGMA(comment(exestr, idstr)) +#else + #define RCSID(idstr) static const char rcsid[] = idstr +#endif + +#include "compiler.h" + +#ifdef _win_ + #include <malloc.h> +#elif defined(_sun_) + #include <alloca.h> +#endif + +#ifdef NDEBUG + #define Y_IF_DEBUG(X) + #ifdef __cplusplus +constexpr bool Y_IS_DEBUG_BUILD = false; + #endif +#else + #define Y_IF_DEBUG(X) X + #ifdef __cplusplus +constexpr bool Y_IS_DEBUG_BUILD = true; + #endif +#endif + +/** + * @def Y_ARRAY_SIZE + * + * This macro is needed to get number of elements in a statically allocated fixed size array. The + * expression is a compile-time constant and therefore can be used in compile time computations. + * + * @code + * enum ENumbers { + * EN_ONE, + * EN_TWO, + * EN_SIZE + * } + * + * const char* NAMES[] = { + * "one", + * "two" + * } + * + * static_assert(Y_ARRAY_SIZE(NAMES) == EN_SIZE, "you should define `NAME` for each enumeration"); + * @endcode + * + * This macro also catches type errors. If you see a compiler error like "warning: division by zero + * is undefined" when using `Y_ARRAY_SIZE` then you are probably giving it a pointer. + * + * Since all of our code is expected to work on a 64 bit platform where pointers are 8 bytes we may + * falsefully accept pointers to types of sizes that are divisors of 8 (1, 2, 4 and 8). + */ +#if defined(__cplusplus) + #include <util/generic/array_size.h> +#else + #undef Y_ARRAY_SIZE + #define Y_ARRAY_SIZE(arr) \ + ((sizeof(arr) / sizeof((arr)[0])) / static_cast<size_t>(!(sizeof(arr) % sizeof((arr)[0])))) +#endif + +#undef Y_ARRAY_BEGIN +#define Y_ARRAY_BEGIN(arr) (arr) + +#undef Y_ARRAY_END +#define Y_ARRAY_END(arr) ((arr) + Y_ARRAY_SIZE(arr)) + +/** + * Concatenates two symbols, even if one of them is itself a macro. + */ +#define Y_CAT(X, Y) Y_CAT_I(X, Y) +#define Y_CAT_I(X, Y) Y_CAT_II(X, Y) +#define Y_CAT_II(X, Y) X##Y + +#define Y_STRINGIZE(X) UTIL_PRIVATE_STRINGIZE_AUX(X) +#define UTIL_PRIVATE_STRINGIZE_AUX(X) #X + +#if defined(__COUNTER__) + #define Y_GENERATE_UNIQUE_ID(N) Y_CAT(N, __COUNTER__) +#endif + +#if !defined(Y_GENERATE_UNIQUE_ID) + #define Y_GENERATE_UNIQUE_ID(N) Y_CAT(N, __LINE__) +#endif + +#define NPOS ((size_t)-1) |