24 #include <type_traits>
28 #ifndef __STDC_LIMIT_MACROS
29 # define __STDC_LIMIT_MACROS
33 #if defined(__FreeBSD__)
34 # include <sys/param.h>
75 #if (__cplusplus >= 202001L)
76 # define OIIO_CPLUSPLUS_VERSION 20
77 # define OIIO_CONSTEXPR17 constexpr
78 # define OIIO_CONSTEXPR20 constexpr
79 # define OIIO_INLINE_CONSTEXPR inline constexpr
80 #elif (__cplusplus >= 201703L)
81 # define OIIO_CPLUSPLUS_VERSION 17
82 # define OIIO_CONSTEXPR17 constexpr
83 # define OIIO_CONSTEXPR20
84 # define OIIO_INLINE_CONSTEXPR inline constexpr
85 #elif (__cplusplus >= 201402L) || (defined(_MSC_VER) && _MSC_VER >= 1914)
86 # define OIIO_CPLUSPLUS_VERSION 14
87 # define OIIO_CONSTEXPR17
88 # define OIIO_CONSTEXPR20
89 # define OIIO_INLINE_CONSTEXPR static constexpr
91 # error "This version of OIIO is meant to work only with C++14 and above"
95 #define OIIO_CONSTEXPR14 constexpr
98 #define OIIO_CONSTEXPR constexpr
99 #define OIIO_CONSTEXPR_OR_CONST constexpr
102 #define OIIO_NOEXCEPT noexcept
107 #ifndef __has_cpp_attribute
108 # define __has_cpp_attribute(x) 0
112 #ifndef __has_attribute
113 # define __has_attribute(x) 0
118 #ifndef __has_include
119 # define __has_include(x) 0
143 #if defined(__GNUC__) && !defined(__clang__)
144 # define OIIO_GNUC_VERSION (10000*__GNUC__ + 100*__GNUC_MINOR__ + __GNUC_PATCHLEVEL__)
146 # define OIIO_GNUC_VERSION 0
153 #if defined(__clang__) && !defined(__apple_build_version__) && !defined(__INTEL_LLVM_COMPILER)
154 # define OIIO_CLANG_VERSION (10000*__clang_major__ + 100*__clang_minor__ + __clang_patchlevel__)
156 # define OIIO_CLANG_VERSION 0
161 #if defined(__clang__) && defined(__apple_build_version__)
162 # if defined(__INTEL_LLVM_COMPILER)
163 # error Not expected for __INTEL_LLVM_COMPILER to be defined with an __apple_build_version__
168 # define OIIO_APPLE_CLANG_VERSION (10000*__clang_major__ + 100*__clang_minor__ + __clang_patchlevel__)
170 # define OIIO_APPLE_CLANG_VERSION 0
175 #if defined(__INTEL_COMPILER)
176 # define OIIO_INTEL_CLASSIC_COMPILER_VERSION __INTEL_COMPILER
178 # define OIIO_INTEL_CLASSIC_COMPILER_VERSION 0
183 #if !defined(__INTEL_COMPILER) && defined(__clang__)
184 # define OIIO_NON_INTEL_CLANG __clang__
186 # define OIIO_NON_INTEL_CLANG 0
194 #if defined(__INTEL_LLVM_COMPILER)
195 # define OIIO_INTEL_LLVM_COMPILER __INTEL_LLVM_COMPILER
196 # define OIIO_INTEL_CLANG_VERSION (10000*__clang_major__ + 100*__clang_minor__ + __clang_patchlevel__)
198 # define OIIO_INTEL_LLVM_COMPILER 0
199 # define OIIO_INTEL_CLANG_VERSION 0
204 #if defined(__clang__)
205 # define OIIO_ANY_CLANG 1
207 # define OIIO_ANY_CLANG 0
211 #if defined(_MSC_VER)
212 # define OIIO_MSVS_VERSION _MSC_VER
213 # define OIIO_MSVS_AT_LEAST_2013 (_MSC_VER >= 1800)
214 # define OIIO_MSVS_BEFORE_2013 (_MSC_VER < 1800)
215 # define OIIO_MSVS_AT_LEAST_2015 (_MSC_VER >= 1900)
216 # define OIIO_MSVS_BEFORE_2015 (_MSC_VER < 1900)
217 # define OIIO_MSVS_AT_LEAST_2017 (_MSC_VER >= 1910)
218 # define OIIO_MSVS_BEFORE_2017 (_MSC_VER < 1910)
219 # define OIIO_MSVS_AT_LEAST_2019 (_MSC_VER >= 1920)
220 # define OIIO_MSVS_BEFORE_2019 (_MSC_VER < 1920)
221 # define OIIO_MSVS_AT_LEAST_2022 (_MSC_VER >= 1930)
222 # define OIIO_MSVS_BEFORE_2022 (_MSC_VER < 1930)
223 # if OIIO_MSVS_BEFORE_2017
224 # error "This version of OIIO is meant to work only with Visual Studio 2017 or later"
227 # define OIIO_MSVS_VERSION 0
228 # define OIIO_MSVS_AT_LEAST_2013 0
229 # define OIIO_MSVS_BEFORE_2013 0
230 # define OIIO_MSVS_AT_LEAST_2015 0
231 # define OIIO_MSVS_BEFORE_2015 0
232 # define OIIO_MSVS_AT_LEAST_2017 0
233 # define OIIO_MSVS_BEFORE_2017 0
234 # define OIIO_MSVS_AT_LEAST_2019 0
235 # define OIIO_MSVS_BEFORE_2019 0
236 # define OIIO_MSVS_AT_LEAST_2022 0
237 # define OIIO_MSVS_BEFORE_2022 0
253 #if defined(_MSC_VER)
255 #define OIIO_PRAGMA(UnQuotedPragma) __pragma(UnQuotedPragma)
258 #define OIIO_PRAGMA(UnQuotedPragma) _Pragma(#UnQuotedPragma)
261 #if defined(__GNUC__)
262 # define OIIO_PRAGMA_WARNING_PUSH OIIO_PRAGMA(GCC diagnostic push)
263 # define OIIO_PRAGMA_WARNING_POP OIIO_PRAGMA(GCC diagnostic pop)
264 # define OIIO_PRAGMA_VISIBILITY_PUSH OIIO_PRAGMA(GCC visibility push(default))
265 # define OIIO_PRAGMA_VISIBILITY_POP OIIO_PRAGMA(GCC visibility pop)
266 # define OIIO_GCC_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
267 # if defined(__clang__)
268 # define OIIO_CLANG_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
269 # define OIIO_GCC_ONLY_PRAGMA(UnQuotedPragma)
271 # define OIIO_CLANG_PRAGMA(UnQuotedPragma)
272 # define OIIO_GCC_ONLY_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
274 # if defined(__INTEL_COMPILER)
275 # define OIIO_INTEL_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
277 # define OIIO_INTEL_PRAGMA(UnQuotedPragma)
279 # if defined(__INTEL_LLVM_COMPILER)
280 # define OIIO_INTEL_LLVM_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
282 # define OIIO_INTEL_LLVM_PRAGMA(UnQuotedPragma)
284 # define OIIO_MSVS_PRAGMA(UnQuotedPragma)
285 #elif defined(_MSC_VER)
286 # define OIIO_PRAGMA_WARNING_PUSH __pragma(warning(push))
287 # define OIIO_PRAGMA_WARNING_POP __pragma(warning(pop))
288 # define OIIO_PRAGMA_VISIBILITY_PUSH
289 # define OIIO_PRAGMA_VISIBILITY_POP
290 # define OIIO_GCC_PRAGMA(UnQuotedPragma)
291 # define OIIO_GCC_ONLY_PRAGMA(UnQuotedPragma)
292 # define OIIO_CLANG_PRAGMA(UnQuotedPragma)
293 # define OIIO_INTEL_PRAGMA(UnQuotedPragma)
294 # define OIIO_INTEL_LLVM_PRAGMA(UnQuotedPragma)
295 # define OIIO_MSVS_PRAGMA(UnQuotedPragma) OIIO_PRAGMA(UnQuotedPragma)
297 # define OIIO_PRAGMA_WARNING_PUSH
298 # define OIIO_PRAGMA_WARNING_POP
299 # define OIIO_PRAGMA_VISIBILITY_PUSH
300 # define OIIO_PRAGMA_VISIBILITY_POP
301 # define OIIO_GCC_PRAGMA(UnQuotedPragma)
302 # define OIIO_GCC_ONLY_PRAGMA(UnQuotedPragma)
303 # define OIIO_CLANG_PRAGMA(UnQuotedPragma)
304 # define OIIO_INTEL_PRAGMA(UnQuotedPragma)
305 # define OIIO_INTEL_LLVM_PRAGMA(UnQuotedPragma)
306 # define OIIO_MSVS_PRAGMA(UnQuotedPragma)
323 #if defined(__GNUC__)
324 # define OIIO_ALLOCA(type, size) (assert(size < (1<<20)), (size) != 0 ? ((type*)__builtin_alloca((size) * sizeof(type))) : nullptr)
326 # define OIIO_ALLOCA(type, size) (assert(size < (1<<20)), (size) != 0 ? ((type*)alloca((size) * sizeof(type))) : nullptr)
330 #define ALLOCA(type, size) OIIO_ALLOCA(type, size)
340 #define OIIO_ALLOCATE_STACK_OR_HEAP(var, T, size) \
341 size_t var##___size = size_t(size); \
342 std::unique_ptr<T[]> var##___heap; \
343 if (var##___size * sizeof(T) <= (1 << 16)) { \
344 var = OIIO_ALLOCA(T, var##___size); \
346 var##___heap.reset(new T[var##___size]); \
347 var = var##___heap.get(); \
354 #if defined(__GNUC__) || __has_attribute(aligned)
355 # define OIIO_ALIGN(size) __attribute__((aligned(size)))
356 #elif defined(_MSC_VER)
357 # define OIIO_ALIGN(size) __declspec(align(size))
358 #elif defined(__INTEL_COMPILER)
359 # define OIIO_ALIGN(size) __declspec(align((size)))
361 # define OIIO_ALIGN(size) alignas(size)
366 #define OIIO_CACHE_LINE_SIZE 64
369 #define OIIO_CACHE_ALIGN OIIO_ALIGN(OIIO_CACHE_LINE_SIZE)
383 #if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER)
384 # define OIIO_LIKELY(x) (__builtin_expect(bool(x), true))
385 # define OIIO_UNLIKELY(x) (__builtin_expect(bool(x), false))
387 # define OIIO_LIKELY(x) (x)
388 # define OIIO_UNLIKELY(x) (x)
396 #if defined(__CUDACC__)
397 # define OIIO_FORCEINLINE __inline__
398 #elif defined(__GNUC__) || defined(__clang__) || __has_attribute(always_inline)
399 # define OIIO_FORCEINLINE inline __attribute__((always_inline))
400 #elif defined(_MSC_VER) || defined(__INTEL_COMPILER)
401 # define OIIO_FORCEINLINE __forceinline
403 # define OIIO_FORCEINLINE inline
412 #if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) || __has_attribute(pure)
413 # define OIIO_PURE_FUNC __attribute__((pure))
414 #elif defined(_MSC_VER)
415 # define OIIO_PURE_FUNC
417 # define OIIO_PURE_FUNC
426 #if defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) || __has_attribute(const)
427 # define OIIO_CONST_FUNC __attribute__((const))
428 #elif defined(_MSC_VER)
429 # define OIIO_CONST_FUNC
431 # define OIIO_CONST_FUNC
436 #if OIIO_CPLUSPLUS_VERSION >= 17 || __has_cpp_attribute(maybe_unused)
437 # define OIIO_MAYBE_UNUSED [[maybe_unused]]
438 #elif defined(__GNUC__) || defined(__clang__) || defined(__INTEL_COMPILER) || __has_attribute(unused)
439 # define OIIO_MAYBE_UNUSED __attribute__((unused))
441 # define OIIO_MAYBE_UNUSED
445 #define OIIO_UNUSED_OK OIIO_MAYBE_UNUSED
450 #if defined(__GNUC__) || defined(__clang__) || defined(_MSC_VER) || defined(__INTEL_COMPILER)
451 # define OIIO_RESTRICT __restrict
453 # define OIIO_RESTRICT
459 #if OIIO_CPLUSPLUS_VERSION >= 14 || __has_cpp_attribute(deprecated)
460 # define OIIO_DEPRECATED(msg) [[deprecated(msg)]]
461 #elif defined(__GNUC__) || defined(__clang__) || __has_attribute(deprecated)
462 # define OIIO_DEPRECATED(msg) __attribute__((deprecated(msg)))
463 #elif defined(_MSC_VER)
464 # define OIIO_DEPRECATED(msg) __declspec(deprecated(msg))
466 # define OIIO_DEPRECATED(msg)
473 #if OIIO_CPLUSPLUS_VERSION >= 17 || __has_cpp_attribute(fallthrough)
474 # define OIIO_FALLTHROUGH [[fallthrough]]
476 # define OIIO_FALLTHROUGH
482 #if OIIO_CPLUSPLUS_VERSION >= 17 || __has_cpp_attribute(nodiscard)
483 # define OIIO_NODISCARD [[nodiscard]]
485 # define OIIO_NODISCARD
494 #if defined(__clang__) || (OIIO_GNUC_VERSION > 90000 && !defined(__INTEL_COMPILER)) \
495 || __has_attribute(no_sanitize_address)
496 # define OIIO_NO_SANITIZE_ADDRESS __attribute__((no_sanitize_address))
498 # define OIIO_NO_SANITIZE_ADDRESS
505 #if defined(__clang__) || (OIIO_GNUC_VERSION > 90000 && !defined(__INTEL_COMPILER)) \
506 || __has_attribute(no_sanitize)
507 # define OIIO_NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
509 # define OIIO_NO_SANITIZE_UNDEFINED
516 #if defined(__clang__) || defined(__GNUC__) || __has_attribute(returns_nonnull)
517 # define OIIO_RETURNS_NONNULL __attribute__((returns_nonnull))
519 # define OIIO_RETURNS_NONNULL
526 # define OIIO_HOSTDEVICE __host__ __device__
527 # define OIIO_DEVICE __device__
529 # define OIIO_HOSTDEVICE
537 # define OIIO_DEVICE_CONSTEXPR __device__ constexpr
539 # define OIIO_DEVICE_CONSTEXPR inline
546 #if defined(__PRETTY_FUNCTION__)
547 # define OIIO_PRETTY_FUNCTION __PRETTY_FUNCTION__
548 #elif defined(__FUNCSIG__)
549 # define OIIO_PRETTY_FUNCTION __FUNCSIG__
551 # define OIIO_PRETTY_FUNCTION __FUNCTION__
568 little = __ORDER_LITTLE_ENDIAN__,
569 big = __ORDER_BIG_ENDIAN__,
593 inline void cpuid (
int info[4],
int infoType,
int extra)
597 #if (defined(_M_X64) || defined(_M_IX86) || defined(_M_AMD64) || defined(__i386__) || defined(__x86_64__))
599 __cpuidex(info, infoType, extra);
600 # elif defined(__x86_64__)
601 __asm__ __volatile__ (
603 :
"=a" (info[0]),
"=b" (info[1]),
"=c" (info[2]),
"=d" (info[3])
604 :
"0" (infoType),
"2" (extra));
606 __asm__ __volatile__ (
607 "mov{l}\t{%%}ebx, %1 \n\t"
609 "xchg{l}\t{%%}ebx, %1 \n\t"
610 :
"=a" (info[0]),
"=r" (info[1]),
"=c" (info[2]),
"=d" (info[3])
611 :
"0" (infoType),
"2" (extra));
614 info[0] = 0; info[1] = 0; info[2] = 0; info[3] = 0;
644 template <
typename T,
class... Args>
646 static_assert(
alignof(
T) >
alignof(
void*),
"Type doesn't seem to be over-aligned, aligned_new is not required");
650 return ptr ?
new (
ptr)
T(std::forward<Args>(
args)...) :
nullptr;
654 template <
typename T>
664 #if OIIO_CPLUSPLUS_VERSION >= 14
668 template <
bool B,
class T =
void>
675 #ifndef OIIO_ENABLE_IF
676 # define OIIO_ENABLE_IF(...) OIIO::enable_if_t<(__VA_ARGS__), int> = 0
typename std::enable_if< B, T >::type enable_if_t
Define Imath::enable_if_t to be std for C++14, equivalent for C++11.
**If you just want to fire and args
#define OIIO_NAMESPACE_END
#define OIIO_NAMESPACE_BEGIN