#ifndef MISSING_H #define MISSING_H 1 #if defined(__cplusplus) extern "C" { #if 0 } /* satisfy cc-mode */ #endif #endif #ifdef HAVE_STDLIB_H # include #endif #ifdef HAVE_MATH_H # include #endif #ifndef RB_UNUSED_VAR # if defined(_MSC_VER) && _MSC_VER >= 1911 # define RB_UNUSED_VAR(x) x [[maybe_unused]] # elif defined(__has_cpp_attribute) && __has_cpp_attribute(maybe_unused) # define RB_UNUSED_VAR(x) x [[maybe_unused]] # elif defined(__has_c_attribute) && __has_c_attribute(maybe_unused) # define RB_UNUSED_VAR(x) x [[maybe_unused]] # elif defined(__GNUC__) # define RB_UNUSED_VAR(x) x __attribute__ ((unused)) # else # define RB_UNUSED_VAR(x) x # endif #endif /* RB_UNUSED_VAR */ #if defined(_MSC_VER) && _MSC_VER >= 1310 # define HAVE___ASSUME #elif defined(__INTEL_COMPILER) && __INTEL_COMPILER >= 1300 # define HAVE___ASSUME #endif #ifndef UNREACHABLE # if __has_builtin(__builtin_unreachable) # define UNREACHABLE __builtin_unreachable() # elif HAVE___ASSUME # define UNREACHABLE __assume(0) # else # define UNREACHABLE /* unreachable */ # endif #endif /* UNREACHABLE */ /* bool */ #if defined(__bool_true_false_are_defined) # /* Take that. */ #elif defined(HAVE_STDBOOL_H) # include #else typedef unsigned char _Bool; # define bool _Bool # define true ((_Bool)+1) # define false ((_Bool)-1) # define __bool_true_false_are_defined #endif /* abs */ #ifndef HAVE_LABS static inline long labs(long const x) { if (x < 0) return -x; return x; } #endif #ifndef HAVE_LLABS static inline LONG_LONG llabs(LONG_LONG const x) { if (x < 0) return -x; return x; } #endif #ifdef vabs # undef vabs #endif #if SIZEOF_VALUE <= SIZEOF_INT # define vabs abs #elif SIZEOF_VALUE <= SIZEOF_LONG # define vabs labs #elif SIZEOF_VALUE <= SIZEOF_LONG_LONG # define vabs llabs #endif /* finite */ #ifndef HAVE_FINITE static int finite(double) { return !isnan(n) && !isinf(n); } #endif #ifndef isfinite # ifndef HAVE_ISFINITE # define HAVE_ISFINITE 1 # define isfinite(x) finite(x) # endif #endif /* rational */ #ifndef HAVE_RB_RATIONAL_NUM static inline VALUE rb_rational_num(VALUE rat) { #ifdef HAVE_TYPE_STRUCT_RRATIONAL return RRATIONAL(rat)->num; #else return rb_funcall(rat, rb_intern("numerator"), 0); #endif } #endif #ifndef HAVE_RB_RATIONAL_DEN static inline VALUE rb_rational_den(VALUE rat) { #ifdef HAVE_TYPE_STRUCT_RRATIONAL return RRATIONAL(rat)->den; #else return rb_funcall(rat, rb_intern("denominator"), 0); #endif } #endif /* complex */ #ifndef HAVE_RB_COMPLEX_REAL static inline VALUE rb_complex_real(VALUE cmp) { #ifdef HAVE_TYPE_STRUCT_RCOMPLEX return RCOMPLEX(cmp)->real; #else return rb_funcall(cmp, rb_intern("real"), 0); #endif } #endif #ifndef HAVE_RB_COMPLEX_IMAG static inline VALUE rb_complex_imag(VALUE cmp) { # ifdef HAVE_TYPE_STRUCT_RCOMPLEX return RCOMPLEX(cmp)->imag; # else return rb_funcall(cmp, rb_intern("imag"), 0); # endif } #endif /* array */ #ifndef FIX_CONST_VALUE_PTR # if defined(__fcc__) || defined(__fcc_version) || \ defined(__FCC__) || defined(__FCC_VERSION) /* workaround for old version of Fujitsu C Compiler (fcc) */ # define FIX_CONST_VALUE_PTR(x) ((const VALUE *)(x)) # else # define FIX_CONST_VALUE_PTR(x) (x) # endif #endif #ifndef HAVE_RB_ARRAY_CONST_PTR static inline const VALUE * rb_array_const_ptr(VALUE a) { return FIX_CONST_VALUE_PTR((RBASIC(a)->flags & RARRAY_EMBED_FLAG) ? RARRAY(a)->as.ary : RARRAY(a)->as.heap.ptr); } #endif #ifndef RARRAY_CONST_PTR # define RARRAY_CONST_PTR(a) rb_array_const_ptr(a) #endif #ifndef RARRAY_AREF # define RARRAY_AREF(a, i) (RARRAY_CONST_PTR(a)[i]) #endif /* symbol */ #ifndef HAVE_RB_SYM2STR static inline VALUE rb_sym2str(VALUE sym) { return rb_id2str(SYM2ID(sym)); } #endif /* st */ #ifndef ST2FIX # undef RB_ST2FIX # define RB_ST2FIX(h) LONG2FIX((long)(h)) # define ST2FIX(h) RB_ST2FIX(h) #endif /* warning */ #if !defined(HAVE_RB_CATEGORY_WARN) || !defined(HAVE_CONST_RB_WARN_CATEGORY_DEPRECATED) # define rb_category_warn(category, ...) rb_warn(__VA_ARGS__) #endif #if defined(__cplusplus) #if 0 { /* satisfy cc-mode */ #endif } /* extern "C" { */ #endif #endif /* MISSING_H */