diff options
Diffstat (limited to 'internal/compar.h')
| -rw-r--r-- | internal/compar.h | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/internal/compar.h b/internal/compar.h new file mode 100644 index 0000000000..5eb5e8714e --- /dev/null +++ b/internal/compar.h @@ -0,0 +1,30 @@ +#ifndef INTERNAL_COMPAR_H /*-*-C-*-vi:se ft=c:*/ +#define INTERNAL_COMPAR_H +/** + * @author Ruby developers <ruby-core@ruby-lang.org> + * @copyright This file is a part of the programming language Ruby. + * Permission is hereby granted, to either redistribute and/or + * modify this file, provided that the conditions mentioned in the + * file COPYING are met. Consult the file for details. + * @brief Internal header for Comparable. + */ +#include "internal/basic_operators.h" + +#define STRING_P(s) (RB_TYPE_P((s), T_STRING) && CLASS_OF(s) == rb_cString) + +#define CMP_OPTIMIZABLE(type) BASIC_OP_UNREDEFINED_P(BOP_CMP, type##_REDEFINED_OP_FLAG) + +#define OPTIMIZED_CMP(a, b) \ + ((FIXNUM_P(a) && FIXNUM_P(b) && CMP_OPTIMIZABLE(INTEGER)) ? \ + (((long)a > (long)b) ? 1 : ((long)a < (long)b) ? -1 : 0) : \ + (STRING_P(a) && STRING_P(b) && CMP_OPTIMIZABLE(STRING)) ? \ + rb_str_cmp(a, b) : \ + (RB_FLOAT_TYPE_P(a) && RB_FLOAT_TYPE_P(b) && CMP_OPTIMIZABLE(FLOAT)) ? \ + rb_float_cmp(a, b) : \ + rb_cmpint(rb_funcallv(a, id_cmp, 1, &b), a, b)) + +/* compar.c */ +VALUE rb_invcmp(VALUE, VALUE); +NORETURN(void rb_cmperr_reason(VALUE, VALUE, const char*)); + +#endif /* INTERNAL_COMPAR_H */ |
