mbed I/F binding for mruby

Dependents:   mruby_mbed_web mirb_mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers numeric.h Source File

numeric.h

00001 /*
00002 ** mruby/numeric.h - Numeric, Integer, Float, Fixnum class
00003 **
00004 ** See Copyright Notice in mruby.h
00005 */
00006 
00007 #ifndef MRUBY_NUMERIC_H
00008 #define MRUBY_NUMERIC_H
00009 
00010 #if defined(__cplusplus)
00011 extern "C" {
00012 #endif
00013 
00014 #define POSFIXABLE(f) ((f) <= MRB_INT_MAX)
00015 #define NEGFIXABLE(f) ((f) >= MRB_INT_MIN)
00016 #define FIXABLE(f) (POSFIXABLE(f) && NEGFIXABLE(f))
00017 
00018 MRB_API mrb_value mrb_flo_to_fixnum(mrb_state *mrb, mrb_value val);
00019 MRB_API mrb_value mrb_fixnum_to_str(mrb_state *mrb, mrb_value x, int base);
00020 MRB_API mrb_float mrb_to_flo(mrb_state *mrb, mrb_value x);
00021 
00022 mrb_value mrb_fixnum_plus(mrb_state *mrb, mrb_value x, mrb_value y);
00023 mrb_value mrb_fixnum_minus(mrb_state *mrb, mrb_value x, mrb_value y);
00024 mrb_value mrb_fixnum_mul(mrb_state *mrb, mrb_value x, mrb_value y);
00025 mrb_value mrb_num_div(mrb_state *mrb, mrb_value x, mrb_value y);
00026 
00027 #define MRB_UINT_MAKE2(n) uint ## n ## _t
00028 #define MRB_UINT_MAKE(n) MRB_UINT_MAKE2(n)
00029 #define mrb_uint MRB_UINT_MAKE(MRB_INT_BIT)
00030 
00031 #ifdef MRB_WORD_BOXING
00032 # define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1 - MRB_FIXNUM_SHIFT))
00033 #else
00034 # define MRB_INT_OVERFLOW_MASK ((mrb_uint)1 << (MRB_INT_BIT - 1))
00035 #endif
00036 
00037 static inline mrb_bool
00038 mrb_int_add_overflow(mrb_int augend, mrb_int addend, mrb_int *sum)
00039 {
00040   mrb_uint x = (mrb_uint)augend;
00041   mrb_uint y = (mrb_uint)addend;
00042   mrb_uint z = (mrb_uint)(x + y);
00043   *sum = (mrb_int)z;
00044   return !!(((x ^ z) & (y ^ z)) & MRB_INT_OVERFLOW_MASK);
00045 }
00046 
00047 static inline mrb_bool
00048 mrb_int_sub_overflow(mrb_int minuend, mrb_int subtrahend, mrb_int *difference)
00049 {
00050   mrb_uint x = (mrb_uint)minuend;
00051   mrb_uint y = (mrb_uint)subtrahend;
00052   mrb_uint z = (mrb_uint)(x - y);
00053   *difference = (mrb_int)z;
00054   return !!(((x ^ z) & (~y ^ z)) & MRB_INT_OVERFLOW_MASK);
00055 }
00056 
00057 #undef MRB_INT_OVERFLOW_MASK
00058 #undef mrb_uint
00059 #undef MRB_UINT_MAKE
00060 #undef MRB_UINT_MAKE2
00061 
00062 #if defined(__cplusplus)
00063 }  /* extern "C" { */
00064 #endif
00065 
00066 #endif  /* MRUBY_NUMERIC_H */
00067