summaryrefslogtreecommitdiff
path: root/include/ruby/internal/arithmetic/long_long.h
blob: 65dec8729df623b067dde89bc5572897a0b718d1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#ifndef RBIMPL_ARITHMETIC_LONG_LONG_H                /*-*-C++-*-vi:se ft=cpp:*/
#define RBIMPL_ARITHMETIC_LONG_LONG_H
/**
 * @file
 * @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.
 * @warning    Symbols   prefixed  with   either  `RBIMPL`   or  `rbimpl`   are
 *             implementation details.   Don't take  them as canon.  They could
 *             rapidly appear then vanish.  The name (path) of this header file
 *             is also an  implementation detail.  Do not expect  it to persist
 *             at the place it is now.  Developers are free to move it anywhere
 *             anytime at will.
 * @note       To  ruby-core:  remember  that   this  header  can  be  possibly
 *             recursively included  from extension  libraries written  in C++.
 *             Do not  expect for  instance `__VA_ARGS__` is  always available.
 *             We assume C99  for ruby itself but we don't  assume languages of
 *             extension libraries.  They could be written in C++98.
 * @brief      Arithmetic conversion between C's `long long` and Ruby's.
 */
#include "ruby/internal/value.h"
#include "ruby/internal/dllexport.h"
#include "ruby/internal/special_consts.h"
#include "ruby/backward/2/long_long.h"

#define RB_LL2NUM  rb_ll2num_inline   /**< @alias{rb_ll2num_inline} */
#define RB_ULL2NUM rb_ull2num_inline  /**< @alias{rb_ull2num_inline} */
#define LL2NUM     RB_LL2NUM          /**< @old{RB_LL2NUM} */
#define ULL2NUM    RB_ULL2NUM         /**< @old{RB_ULL2NUM} */
#define RB_NUM2LL  rb_num2ll_inline   /**< @alias{rb_num2ll_inline} */
#define RB_NUM2ULL rb_num2ull_inline  /**< @alias{rb_num2ull_inline} */
#define NUM2LL     RB_NUM2LL          /**< @old{RB_NUM2LL} */
#define NUM2ULL    RB_NUM2ULL         /**< @old{RB_NUM2ULL} */

RBIMPL_SYMBOL_EXPORT_BEGIN()
/**
 * Converts a C's `long long` into an instance of ::rb_cInteger.
 *
 * @param[in]  num  Arbitrary `long long` value.
 * @return     An instance of ::rb_cInteger.
 */
VALUE rb_ll2inum(LONG_LONG num);

/**
 * Converts a C's `unsigned long long` into an instance of ::rb_cInteger.
 *
 * @param[in]  num  Arbitrary `unsigned long long` value.
 * @return     An instance of ::rb_cInteger.
 */
VALUE rb_ull2inum(unsigned LONG_LONG num);

/**
 * Converts an instance of ::rb_cNumeric into C's `long long`.
 *
 * @param[in]  num             Something numeric.
 * @exception  rb_eTypeError   `num` is not a numeric.
 * @exception  rb_eRangeError  `num` is out of range of `long long`.
 * @return     The passed value converted into C's `long long`.
 */
LONG_LONG rb_num2ll(VALUE num);

/**
 * Converts an instance of ::rb_cNumeric into C's `unsigned long long`.
 *
 * @param[in]  num             Something numeric.
 * @exception  rb_eTypeError   `num` is not a numeric.
 * @exception  rb_eRangeError  `num` is out of range of `unsigned long long`.
 * @return     The passed value converted into C's `unsigned long long`.
 */
unsigned LONG_LONG rb_num2ull(VALUE num);
RBIMPL_SYMBOL_EXPORT_END()

/**
 * Converts a C's `long long` into an instance of ::rb_cInteger.
 *
 * @param[in]  n  Arbitrary `long long` value.
 * @return     An instance of ::rb_cInteger
 */
static inline VALUE
rb_ll2num_inline(LONG_LONG n)
{
    if (FIXABLE(n)) return LONG2FIX((long)n);
    return rb_ll2inum(n);
}

/**
 * Converts a C's `unsigned long long` into an instance of ::rb_cInteger.
 *
 * @param[in]  n  Arbitrary `unsigned long long` value.
 * @return     An instance of ::rb_cInteger
 */
static inline VALUE
rb_ull2num_inline(unsigned LONG_LONG n)
{
    if (POSFIXABLE(n)) return LONG2FIX((long)n);
    return rb_ull2inum(n);
}

/**
 * Converts an instance of ::rb_cNumeric into C's `long long`.
 *
 * @param[in]  x               Something numeric.
 * @exception  rb_eTypeError   `x` is not a numeric.
 * @exception  rb_eRangeError  `x` is out of range of `long long`.
 * @return     The passed value converted into C's `long long`.
 */
static inline LONG_LONG
rb_num2ll_inline(VALUE x)
{
    if (RB_FIXNUM_P(x))
        return RB_FIX2LONG(x);
    else
        return rb_num2ll(x);
}

/**
 * Converts an instance of ::rb_cNumeric into C's `unsigned long long`.
 *
 * @param[in]  x               Something numeric.
 * @exception  rb_eTypeError   `x` is not a numeric.
 * @exception  rb_eRangeError  `x` is out of range of `unsigned long long`.
 * @return     The passed value converted into C's `unsigned long long`.
 */
static inline unsigned LONG_LONG
rb_num2ull_inline(VALUE x)
{
    if (RB_FIXNUM_P(x))
        return RB_FIX2LONG(x);
    else
        return rb_num2ull(x);
}

#endif /* RBIMPL_ARITHMETIC_LONG_LONG_H */