tetl 0.1.0
Embedded Template Library
Loading...
Searching...
No Matches
builtin_functions.hpp
Go to the documentation of this file.
1// SPDX-License-Identifier: BSL-1.0
2// SPDX-FileCopyrightText: Copyright (C) 2019 Tobias Hienzsch
3
4#ifndef TETL_CONFIG_BUILTIN_FUNCTIONS_HPP
5#define TETL_CONFIG_BUILTIN_FUNCTIONS_HPP
6
7#if __has_builtin(__builtin_COLUMN)
8 #define TETL_BUILTIN_COLUMN() __builtin_COLUMN()
9#else
10 #define TETL_BUILTIN_COLUMN() 0
11#endif
12
13#if __has_builtin(__builtin_LINE)
14 #define TETL_BUILTIN_LINE() __builtin_LINE()
15#else
16 #define TETL_BUILTIN_LINE() 0
17#endif
18
19#if __has_builtin(__builtin_FILE)
20 #define TETL_BUILTIN_FILE() __builtin_FILE()
21#else
22 #define TETL_BUILTIN_FILE() __FILE__
23#endif
24
25#if __has_builtin(__builtin_FUNCTION)
26 #define TETL_BUILTIN_FUNCTION() __builtin_FUNCTION()
27#else
28 #define TETL_BUILTIN_FUNCTION() ""
29#endif
30
31// UNREACHABLE
32#if __has_builtin(__builtin_unreachable)
33 #define TETL_BUILTIN_UNREACHABLE __builtin_unreachable()
34#elif defined(TETL_COMPILER_MSVC)
35 #define TETL_BUILTIN_UNREACHABLE __assume(false)
36#else
37 // https://stackoverflow.com/questions/6031819/emulating-gccs-builtin-unreachable
38 // Answer from user iammilind.
39 #define TETL_BUILTIN_UNREACHABLE
40 {
41 struct etl_builtin_unreachable_t {
42 etl_builtin_unreachable_t& operator=(etl_builtin_unreachable_t const&);
43 } x;
44 x = x;
45 }
46#endif
47
48// NAN
49#if __has_builtin(__builtin_nanf) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
50 #define TETL_BUILTIN_NANF(arg) (__builtin_nanf(arg))
51#else
52 #define TETL_BUILTIN_NANF(arg) (0.0F / 0.0F)
53#endif
54
55#if __has_builtin(__builtin_nan) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
56 #define TETL_BUILTIN_NAN(arg) (__builtin_nan(arg))
57#else
58 #define TETL_BUILTIN_NAN (0.0 / 0.0)
59#endif
60
61#if __has_builtin(__builtin_nanl) or defined(TETL_COMPILER_GCC)
62 #define TETL_BUILTIN_NANL(arg) (__builtin_nanl(arg))
63#elif defined(TETL_COMPILER_MSVC)
64 #define TETL_BUILTIN_NANL(arg) (__builtin_nan(arg))
65#else
66 #define TETL_BUILTIN_NANL(arg) (0.0L / 0.0L)
67#endif
68
69// SIGNALING NAN
70#if __has_builtin(__builtin_nansf) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
71 #define TETL_BUILTIN_NANSF(arg) (__builtin_nansf(arg))
72#else
73 #define TETL_BUILTIN_NANSF(arg) (0.0F / 0.0F)
74#endif
75
76#if __has_builtin(__builtin_nans) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
77 #define TETL_BUILTIN_NANS(arg) (__builtin_nans(arg))
78#else
79 #define TETL_BUILTIN_NANS(arg) (0.0 / 0.0)
80#endif
81
82#if __has_builtin(__builtin_nansl) or defined(TETL_COMPILER_GCC)
83 #define TETL_BUILTIN_NANSL(arg) (__builtin_nansl(arg))
84#elif defined(TETL_COMPILER_MSVC)
85 #define TETL_BUILTIN_NANSL(arg) (__builtin_nans(arg))
86#else
87 #define TETL_BUILTIN_NANSL(arg) (0.0L / 0.0L)
88#endif
89
90// HUGE VAL
91#if __has_builtin(__builtin_huge_valf) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
92 #define TETL_BUILTIN_HUGE_VALF (__builtin_huge_valf())
93#else
94 #define TETL_BUILTIN_HUGE_VALF (1.0F / 0.0F)
95#endif
96
97#if __has_builtin(__builtin_huge_val) or defined(TETL_COMPILER_MSVC) or defined(TETL_COMPILER_GCC)
98 #define TETL_BUILTIN_HUGE_VAL (__builtin_huge_val())
99#else
100 #define TETL_BUILTIN_HUGE_VAL (1.0 / 0.0)
101#endif
102
103#if __has_builtin(__builtin_huge_vall) or defined(TETL_COMPILER_GCC)
104 #define TETL_BUILTIN_HUGE_VALL (__builtin_huge_vall())
105#elif defined(TETL_COMPILER_MSVC)
106 #define TETL_BUILTIN_HUGE_VALL (__builtin_huge_val())
107#else
108 #define TETL_BUILTIN_HUGE_VALL (1.0L / 0.0L)
109#endif
110
111#if defined(TETL_COMPILER_CLANG) or defined(TETL_COMPILER_MSVC)
112 #define TETL_BUILTIN_INT_SEQ(T, N) __make_integer_seq<integer_sequence, T, N>
113#else
114 #define TETL_BUILTIN_INT_SEQ(T, N) integer_sequence<T, __integer_pack(N)...>
115#endif
116
117#endif // TETL_CONFIG_BUILTIN_FUNCTIONS_HPP