5 #ifndef _SPICA_COMMON_H_
6 #define _SPICA_COMMON_H_
13 #include <type_traits>
15 #if defined(_WIN32) || defined(__WIN32__)
24 #if (defined(WIN32) || defined(_WIN32) || defined(WINCE) || defined(__CYGWIN__))
25 # if defined(SPICA_API_EXPORT)
26 # define SPICA_EXPORTS __declspec(dllexport)
27 # define SPICA_IMPORTS
29 # define SPICA_EXPORTS
30 # define SPICA_IMPORTS __declspec(dllimport)
32 # define MEM_ALIGN(n) alignas(n)
33 #elif defined(__GNUC__) && __GNUC__ >= 4
34 # define SPICA_EXPORTS __attribute__((visibility ("default")))
35 # define SPICA_IMPORTS __attribute__((visibility ("hidden")))
36 # define MEM_ALIGN(n) __attribute__((aligned(n)))
38 # define SPICA_EXPORTS
39 # define SPICA_IMPORTS
40 # define MEM_ALIGN(n) alignas(n)
43 #if (defined(WIN32) || defined(_WIN32) || defined(WINCE) || defined(__CYGWIN__))
44 # define PACKED(__declare__) __pragma(pack(push,1)) __declare__ __pragma(pack(pop))
46 # define PACKED(__declare__) __declare__ __attribute__((__packed__))
52 static const double PI = 4.0 * atan(1.0);
53 static const double INV_PI = 1.0 / PI;
54 static const double INFTY = 1.0e32;
55 static const double EPS = 1.0e-12;
61 #ifndef __FUNCTION_NAME__
62 #if defined(_WIN32) || defined(__WIN32__)
63 #define __FUNCTION_NAME__ __FUNCTION__
65 #define __FUNCTION_NAME__ __func__
71 #define Assertion(PREDICATE, ...) \
74 std::cerr << "Asssertion \"" \
75 << #PREDICATE << "\" failed in " << __FILE__ \
76 << " line " << __LINE__ \
77 << " in function \"" << (__FUNCTION_NAME__) << "\"" \
79 fprintf(stderr, __VA_ARGS__); \
80 std::cerr << std::endl; \
85 #define Assertion(PREDICATE, ...) do {} while (false)
93 #define MsgInfo(...) \
95 std::cout << "[INFO] "; \
96 fprintf(stdout, __VA_ARGS__); \
97 std::cout << std::endl; \
99 #define Warning(...) \
101 std::cerr << "[WARNING] "; \
102 fprintf(stderr, __VA_ARGS__); \
103 std::cerr << std::endl; \
106 #define SpicaInfo(...)
107 #define SpicaWarn(...)
109 #define FatalError(...) \
111 std::cerr << "[ERROR] "; \
112 fprintf(stderr, __VA_ARGS__); \
113 std::cerr << std::endl; \
121 #if defined(_WIN32) || defined(__WIN32__)
122 inline void* align_alloc(
size_t size,
size_t alignsize) {
123 return _aligned_malloc(size, alignsize);
125 inline void align_free(
void* mem) {
130 inline void* align_alloc(
size_t size,
size_t alignsize) {
132 int ret = posix_memalign((
void**)&mem, alignsize, size);
133 return (ret == 0) ? mem :
nullptr;
135 inline void align_free(
void* mem) {
145 extern void* enabler;
148 typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
149 inline T clamp(T v, T lo, T hi) {
156 typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
157 inline T max3(T a, T b, T c) {
158 return std::max(a, std::max(b, c));
162 typename std::enable_if<std::is_arithmetic<T>::value>::type *& = enabler>
163 inline T min3(T a, T b, T c) {
164 return std::min(a, std::min(b, c));
167 inline double lerp(
double t,
double v1,
double v2) {
168 return (1.0 - t) * v1 + t * v2;
171 #endif // _SPICA_COMMON_H_