xnd 0.2.0dev3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CONTRIBUTING.md +42 -0
- data/Gemfile +3 -0
- data/History.md +0 -0
- data/README.md +7 -0
- data/Rakefile +135 -0
- data/ext/ruby_xnd/extconf.rb +70 -0
- data/ext/ruby_xnd/float_pack_unpack.c +277 -0
- data/ext/ruby_xnd/float_pack_unpack.h +39 -0
- data/ext/ruby_xnd/gc_guard.c +36 -0
- data/ext/ruby_xnd/gc_guard.h +12 -0
- data/ext/ruby_xnd/include/xnd.h +449 -0
- data/ext/ruby_xnd/lib/libxnd.a +0 -0
- data/ext/ruby_xnd/lib/libxnd.so +1 -0
- data/ext/ruby_xnd/lib/libxnd.so.0 +1 -0
- data/ext/ruby_xnd/lib/libxnd.so.0.2.0dev3 +0 -0
- data/ext/ruby_xnd/memory_block_object.c +32 -0
- data/ext/ruby_xnd/memory_block_object.h +33 -0
- data/ext/ruby_xnd/ruby_xnd.c +1953 -0
- data/ext/ruby_xnd/ruby_xnd.h +61 -0
- data/ext/ruby_xnd/ruby_xnd_internal.h +85 -0
- data/ext/ruby_xnd/util.h +170 -0
- data/ext/ruby_xnd/xnd/AUTHORS.txt +5 -0
- data/ext/ruby_xnd/xnd/INSTALL.txt +134 -0
- data/ext/ruby_xnd/xnd/LICENSE.txt +29 -0
- data/ext/ruby_xnd/xnd/MANIFEST.in +3 -0
- data/ext/ruby_xnd/xnd/Makefile.in +80 -0
- data/ext/ruby_xnd/xnd/README.rst +44 -0
- data/ext/ruby_xnd/xnd/config.guess +1530 -0
- data/ext/ruby_xnd/xnd/config.h.in +22 -0
- data/ext/ruby_xnd/xnd/config.sub +1782 -0
- data/ext/ruby_xnd/xnd/configure +4867 -0
- data/ext/ruby_xnd/xnd/configure.ac +164 -0
- data/ext/ruby_xnd/xnd/doc/Makefile +14 -0
- data/ext/ruby_xnd/xnd/doc/_static/copybutton.js +66 -0
- data/ext/ruby_xnd/xnd/doc/conf.py +26 -0
- data/ext/ruby_xnd/xnd/doc/index.rst +44 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/data-structures.rst +186 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/functions.rst +148 -0
- data/ext/ruby_xnd/xnd/doc/libxnd/index.rst +25 -0
- data/ext/ruby_xnd/xnd/doc/releases/index.rst +34 -0
- data/ext/ruby_xnd/xnd/doc/xnd/align-pack.rst +96 -0
- data/ext/ruby_xnd/xnd/doc/xnd/buffer-protocol.rst +42 -0
- data/ext/ruby_xnd/xnd/doc/xnd/index.rst +30 -0
- data/ext/ruby_xnd/xnd/doc/xnd/quickstart.rst +62 -0
- data/ext/ruby_xnd/xnd/doc/xnd/types.rst +674 -0
- data/ext/ruby_xnd/xnd/install-sh +527 -0
- data/ext/ruby_xnd/xnd/libxnd/Makefile.in +102 -0
- data/ext/ruby_xnd/xnd/libxnd/Makefile.vc +112 -0
- data/ext/ruby_xnd/xnd/libxnd/bitmaps.c +345 -0
- data/ext/ruby_xnd/xnd/libxnd/contrib.h +313 -0
- data/ext/ruby_xnd/xnd/libxnd/copy.c +944 -0
- data/ext/ruby_xnd/xnd/libxnd/equal.c +1216 -0
- data/ext/ruby_xnd/xnd/libxnd/inline.h +154 -0
- data/ext/ruby_xnd/xnd/libxnd/overflow.h +147 -0
- data/ext/ruby_xnd/xnd/libxnd/split.c +286 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.in +39 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/Makefile.vc +44 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/README.txt +2 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/runtest.c +101 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/test.h +48 -0
- data/ext/ruby_xnd/xnd/libxnd/tests/test_fixed.c +108 -0
- data/ext/ruby_xnd/xnd/libxnd/xnd.c +1304 -0
- data/ext/ruby_xnd/xnd/libxnd/xnd.h +449 -0
- data/ext/ruby_xnd/xnd/python/test_xnd.py +3144 -0
- data/ext/ruby_xnd/xnd/python/xnd/__init__.py +290 -0
- data/ext/ruby_xnd/xnd/python/xnd/_xnd.c +2822 -0
- data/ext/ruby_xnd/xnd/python/xnd/contrib/pretty.py +850 -0
- data/ext/ruby_xnd/xnd/python/xnd/docstrings.h +129 -0
- data/ext/ruby_xnd/xnd/python/xnd/pyxnd.h +200 -0
- data/ext/ruby_xnd/xnd/python/xnd/util.h +182 -0
- data/ext/ruby_xnd/xnd/python/xnd_randvalue.py +1121 -0
- data/ext/ruby_xnd/xnd/python/xnd_support.py +106 -0
- data/ext/ruby_xnd/xnd/setup.py +303 -0
- data/ext/ruby_xnd/xnd/vcbuild/INSTALL.txt +42 -0
- data/ext/ruby_xnd/xnd/vcbuild/runtest32.bat +16 -0
- data/ext/ruby_xnd/xnd/vcbuild/runtest64.bat +14 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcbuild32.bat +29 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcbuild64.bat +29 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcclean.bat +13 -0
- data/ext/ruby_xnd/xnd/vcbuild/vcdistclean.bat +14 -0
- data/lib/ruby_xnd.so +0 -0
- data/lib/xnd.rb +306 -0
- data/lib/xnd/monkeys.rb +29 -0
- data/lib/xnd/version.rb +6 -0
- data/spec/debug_spec.rb +9 -0
- data/spec/gc_guard_spec.rb +10 -0
- data/spec/leakcheck.rb +9 -0
- data/spec/spec_helper.rb +877 -0
- data/spec/type_inference_spec.rb +81 -0
- data/spec/xnd_spec.rb +2921 -0
- data/xnd.gemspec +47 -0
- metadata +215 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/* BSD 3-Clause License
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 2018, Quansight and Sameer Deshmukh
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
|
8
|
+
*
|
|
9
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
* list of conditions and the following disclaimer.
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* * Neither the name of the copyright holder nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/* File containing headers for Ruby XND wrapper.
|
|
33
|
+
*
|
|
34
|
+
* Author: Sameer Deshmukh (@v0dro)
|
|
35
|
+
*/
|
|
36
|
+
#ifndef RUBY_XND_H
|
|
37
|
+
#define RUBY_XND_H
|
|
38
|
+
|
|
39
|
+
#ifdef __cplusplus
|
|
40
|
+
extern "C" {
|
|
41
|
+
#endif
|
|
42
|
+
|
|
43
|
+
#include "ruby.h"
|
|
44
|
+
#include "ndtypes.h"
|
|
45
|
+
#include "xnd.h"
|
|
46
|
+
|
|
47
|
+
size_t rb_xnd_hash_size(VALUE hash);
|
|
48
|
+
int rb_xnd_get_complex_values(VALUE comp, double *real, double *imag);
|
|
49
|
+
/* Return true if obj is of type XND. */
|
|
50
|
+
int rb_xnd_check_type(VALUE obj);
|
|
51
|
+
const xnd_t * rb_xnd_const_xnd(VALUE xnd);
|
|
52
|
+
VALUE rb_xnd_empty_from_type(ndt_t *t);
|
|
53
|
+
VALUE rb_xnd_from_xnd(xnd_t *x);
|
|
54
|
+
|
|
55
|
+
typedef struct XndObject XndObject;
|
|
56
|
+
|
|
57
|
+
#ifdef __cplusplus
|
|
58
|
+
}
|
|
59
|
+
#endif
|
|
60
|
+
|
|
61
|
+
#endif /* RUBY_XND_H */
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/* BSD 3-Clause License
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 2018, Quansight and Sameer Deshmukh
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
|
8
|
+
*
|
|
9
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
* list of conditions and the following disclaimer.
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* * Neither the name of the copyright holder nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* File containing internal declarations for Ruby XND wrapper.
|
|
34
|
+
*
|
|
35
|
+
* Author: Sameer Deshmukh (@v0dro)
|
|
36
|
+
*/
|
|
37
|
+
|
|
38
|
+
#ifndef RUBY_XND_INTERNAL_H
|
|
39
|
+
#define RUBY_XND_INTERNAL_H
|
|
40
|
+
|
|
41
|
+
//#define XND_DEBUG 1
|
|
42
|
+
|
|
43
|
+
#ifdef XND_DEBUG
|
|
44
|
+
#include <assert.h>
|
|
45
|
+
#endif
|
|
46
|
+
|
|
47
|
+
#include <float.h>
|
|
48
|
+
#include "ruby.h"
|
|
49
|
+
#include "ruby/encoding.h"
|
|
50
|
+
#include "ruby_ndtypes.h"
|
|
51
|
+
#include "ruby_xnd.h"
|
|
52
|
+
#include "util.h"
|
|
53
|
+
#include "float_pack_unpack.h"
|
|
54
|
+
|
|
55
|
+
extern VALUE mRubyXND_GCGuard;
|
|
56
|
+
|
|
57
|
+
/* typedefs */
|
|
58
|
+
typedef struct XndObject XndObject;
|
|
59
|
+
typedef struct MemoryBlockObject MemoryBlockObject;
|
|
60
|
+
|
|
61
|
+
#include "gc_guard.h"
|
|
62
|
+
|
|
63
|
+
/* macros */
|
|
64
|
+
#if SIZEOF_LONG == SIZEOF_VOIDP
|
|
65
|
+
# define PTR2NUM(x) (LONG2NUM((long)(x)))
|
|
66
|
+
# define NUM2PTR(x) ((void*)(NUM2ULONG(x)))
|
|
67
|
+
#elif SIZEOF_LONG_LONG == SIZEOF_VOIDP
|
|
68
|
+
# define PTR2NUM(x) (LL2NUM((LONG_LONG)(x)))
|
|
69
|
+
# define NUM2PTR(x) ((void*)(NUM2ULL(x)))
|
|
70
|
+
#else
|
|
71
|
+
# error ---->> ruby requires sizeof(void*) == sizeof(long) or sizeof(LONG_LONG) to be compiled. <<----
|
|
72
|
+
#endif
|
|
73
|
+
|
|
74
|
+
/* Convert C int 't' to Ruby 'true' or 'false'. */
|
|
75
|
+
#define INT2BOOL(t) (t ? Qtrue : Qfalse)
|
|
76
|
+
|
|
77
|
+
#ifdef WORDS_BIGENDIAN
|
|
78
|
+
#define IEEE_BIG_ENDIAN_P 1
|
|
79
|
+
#define IEEE_LITTLE_ENDIAN_P NULL
|
|
80
|
+
#else
|
|
81
|
+
#define IEEE_LITTLE_ENDIAN_P 1
|
|
82
|
+
#define IEEE_BIG_ENDIAN_P NULL
|
|
83
|
+
#endif
|
|
84
|
+
|
|
85
|
+
#endif /* RUBY_XND_INTERNAL_H */
|
data/ext/ruby_xnd/util.h
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/* BSD 3-Clause License
|
|
2
|
+
*
|
|
3
|
+
* Copyright (c) 2018, Quansight and Sameer Deshmukh
|
|
4
|
+
* All rights reserved.
|
|
5
|
+
*
|
|
6
|
+
* Redistribution and use in source and binary forms, with or without
|
|
7
|
+
* modification, are permitted provided that the following conditions are met:
|
|
8
|
+
*
|
|
9
|
+
* * Redistributions of source code must retain the above copyright notice, this
|
|
10
|
+
* list of conditions and the following disclaimer.
|
|
11
|
+
*
|
|
12
|
+
* * Redistributions in binary form must reproduce the above copyright notice,
|
|
13
|
+
* this list of conditions and the following disclaimer in the documentation
|
|
14
|
+
* and/or other materials provided with the distribution.
|
|
15
|
+
*
|
|
16
|
+
* * Neither the name of the copyright holder nor the names of its
|
|
17
|
+
* contributors may be used to endorse or promote products derived from
|
|
18
|
+
* this software without specific prior written permission.
|
|
19
|
+
*
|
|
20
|
+
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
|
21
|
+
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
22
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
23
|
+
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
|
24
|
+
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
25
|
+
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
|
26
|
+
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
|
27
|
+
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
28
|
+
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
29
|
+
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/* Utility functions for Ruby XND wrapper.
|
|
33
|
+
*
|
|
34
|
+
* Author: Sameer Deshmukh (@v0dro)
|
|
35
|
+
*/
|
|
36
|
+
|
|
37
|
+
#ifndef UTIL_H
|
|
38
|
+
#define UTIL_H
|
|
39
|
+
|
|
40
|
+
#include "ruby.h"
|
|
41
|
+
#include <stdlib.h>
|
|
42
|
+
#include <stdint.h>
|
|
43
|
+
#include <inttypes.h>
|
|
44
|
+
#include "ndtypes.h"
|
|
45
|
+
|
|
46
|
+
/* Raise an error stored in $!. Clears it before raising. */
|
|
47
|
+
inline void
|
|
48
|
+
raise_error(void)
|
|
49
|
+
{
|
|
50
|
+
VALUE exeception = rb_errinfo();
|
|
51
|
+
|
|
52
|
+
rb_set_errinfo(Qnil);
|
|
53
|
+
rb_exc_raise(exeception);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
inline void
|
|
57
|
+
set_error_info(VALUE err, const char * msg)
|
|
58
|
+
{
|
|
59
|
+
rb_set_errinfo(rb_exc_new2(err, msg));
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
static inline size_t
|
|
63
|
+
safe_downcast(int64_t size)
|
|
64
|
+
{
|
|
65
|
+
#if SIZE_MAX < INT64_MAX
|
|
66
|
+
if (size > INT32_MAX) {
|
|
67
|
+
rb_raise(rb_eSizeError,
|
|
68
|
+
"sizes should never exceed INT32_MAX on 32-bit platforms.");
|
|
69
|
+
}
|
|
70
|
+
#endif
|
|
71
|
+
return (size_t)size;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
static inline bool
|
|
75
|
+
check_invariants(const ndt_t *t)
|
|
76
|
+
{
|
|
77
|
+
#if SIZE_MAX < INT64_MAX
|
|
78
|
+
return safe_downcast(t->datasize) >= 0;
|
|
79
|
+
#else
|
|
80
|
+
(void)t;
|
|
81
|
+
return 1;
|
|
82
|
+
#endif
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
static inline VALUE
|
|
86
|
+
array_new(int64_t size)
|
|
87
|
+
{
|
|
88
|
+
#if SIZE_MAX < INT64_MAX
|
|
89
|
+
size_t n = safe_downcast(size);
|
|
90
|
+
return n < 0 ? NULL : rb_ary_new2(n);
|
|
91
|
+
#else
|
|
92
|
+
return rb_ary_new2(size);
|
|
93
|
+
#endif
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
static inline VALUE
|
|
97
|
+
bytes_from_string_and_size(const char *str, int64_t size)
|
|
98
|
+
{
|
|
99
|
+
#if SIZE_MAX < INT64_MAX
|
|
100
|
+
size_t n = safe_downcast(size);
|
|
101
|
+
return n < 0 ? NULL : rb_str_new(str, n);
|
|
102
|
+
#else
|
|
103
|
+
return rb_str_new(str, size);
|
|
104
|
+
#endif
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
static long long
|
|
108
|
+
mod(long long a, long long b)
|
|
109
|
+
{
|
|
110
|
+
long long r = a % b;
|
|
111
|
+
return r < 0 ? r + b : r;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
static inline int
|
|
115
|
+
rb_range_unpack(VALUE range, long long *begin, long long *end, long long *step, size_t size)
|
|
116
|
+
{
|
|
117
|
+
/* FIXME: As of 27 Aug. 2018 Ruby trunk implements step as a property of
|
|
118
|
+
Range and XND will support it as and when it is available. Maybe for
|
|
119
|
+
now we can implement a #step iterator in a separate method.
|
|
120
|
+
*/
|
|
121
|
+
*step = 1;
|
|
122
|
+
VALUE rb_begin = rb_funcall(range, rb_intern("begin"), 0, NULL);
|
|
123
|
+
VALUE rb_end = rb_funcall(range, rb_intern("end"), 0, NULL);
|
|
124
|
+
int exclude_end = RTEST(rb_funcall(range, rb_intern("exclude_end?"), 0, NULL));
|
|
125
|
+
|
|
126
|
+
if (RB_TYPE_P(rb_begin, T_FLOAT)) {
|
|
127
|
+
double value = RFLOAT_VALUE(rb_begin);
|
|
128
|
+
|
|
129
|
+
if (isinf(value)) {
|
|
130
|
+
*begin = 0;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
long long temp = NUM2LL(rb_begin);
|
|
135
|
+
|
|
136
|
+
if (temp < 0) { /* if negative index map to positive. */
|
|
137
|
+
temp = mod(temp, (long long)size);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
*begin = temp;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
if (RB_TYPE_P(rb_end, T_FLOAT)) {
|
|
144
|
+
double value = RFLOAT_VALUE(rb_end);
|
|
145
|
+
|
|
146
|
+
if (isinf(value)) {
|
|
147
|
+
*end = INT64_MAX;
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
long long temp = NUM2LL(rb_end);
|
|
153
|
+
|
|
154
|
+
if (temp < 0) { /* if negative index map to ppositive. */
|
|
155
|
+
temp = mod(temp, (long long)size);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
*end = temp;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/* a[0..0] in Ruby returns the 0th index.
|
|
162
|
+
a[0...0] in Ruby returns empty array like a[0:0] in Python.
|
|
163
|
+
libxnd does not include the last index by default.
|
|
164
|
+
*/
|
|
165
|
+
if (!exclude_end) {
|
|
166
|
+
*end += 1;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#endif /* UTIL_H */
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
Requirements (libndtypes)
|
|
4
|
+
=========================
|
|
5
|
+
|
|
6
|
+
Unless libndtypes has already been installed in the system directories,
|
|
7
|
+
it is recommended to clone libndtypes into the xnd directory.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Get ndtypes
|
|
11
|
+
-----------
|
|
12
|
+
git clone https://github.com/plures/ndtypes.git
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
For building libxnd only
|
|
16
|
+
------------------------
|
|
17
|
+
cd ndtypes
|
|
18
|
+
./configure
|
|
19
|
+
make
|
|
20
|
+
cd ..
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
For building the xnd Python module
|
|
24
|
+
----------------------------------
|
|
25
|
+
# This also builds libndtypes and copies the ndtypes Python package into
|
|
26
|
+
# the python directory next to the xnd package.
|
|
27
|
+
cd ndtypes
|
|
28
|
+
python3 setup.py install --local=../python
|
|
29
|
+
cd ..
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
Unix: libxnd build instructions
|
|
33
|
+
===============================
|
|
34
|
+
|
|
35
|
+
# Build
|
|
36
|
+
./configure
|
|
37
|
+
make
|
|
38
|
+
|
|
39
|
+
# Test
|
|
40
|
+
make check
|
|
41
|
+
|
|
42
|
+
# Install
|
|
43
|
+
make install
|
|
44
|
+
|
|
45
|
+
# Clean
|
|
46
|
+
make clean
|
|
47
|
+
|
|
48
|
+
# Distclean
|
|
49
|
+
make distclean
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
Windows: libxnd build instructions
|
|
53
|
+
==================================
|
|
54
|
+
|
|
55
|
+
See vcbuild/INSTALL.txt.
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
Unix/Windows: Python module build instructions
|
|
59
|
+
==============================================
|
|
60
|
+
|
|
61
|
+
To avoid shared library mismatches, the Python module builds with an rpath
|
|
62
|
+
and ships the library inside the package.
|
|
63
|
+
|
|
64
|
+
Unless you are a distributor with tight control over the system library
|
|
65
|
+
versions, it is not recommended to install the library for the Python
|
|
66
|
+
module.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
Build all
|
|
70
|
+
---------
|
|
71
|
+
|
|
72
|
+
# Build libxnd and the module (libxnd is copied into the package)
|
|
73
|
+
python3 setup.py build
|
|
74
|
+
|
|
75
|
+
# Test
|
|
76
|
+
python3 setup.py test
|
|
77
|
+
|
|
78
|
+
# Doctest (optional, relies on Sphinx)
|
|
79
|
+
python3 setup.py doctest
|
|
80
|
+
|
|
81
|
+
# Install
|
|
82
|
+
python3 setup.py install
|
|
83
|
+
|
|
84
|
+
# Clean libxnd and the module
|
|
85
|
+
python3 setup.py distclean
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
Build the module only (for developing)
|
|
89
|
+
--------------------------------------
|
|
90
|
+
|
|
91
|
+
First, build libxnd as above. This also copies the shared library into
|
|
92
|
+
the package. Then, to avoid rebuilding the library repeatedly, use:
|
|
93
|
+
|
|
94
|
+
# Build the module
|
|
95
|
+
python3 setup.py module
|
|
96
|
+
|
|
97
|
+
# Clean the module
|
|
98
|
+
python3 setup.py clean
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
Alternative install (for developing)
|
|
102
|
+
------------------------------------
|
|
103
|
+
|
|
104
|
+
# Install the package into a local directory. This is mainly useful for
|
|
105
|
+
# developing gufuncs:
|
|
106
|
+
python3 setup.py install --local="$PWD/../python"
|
|
107
|
+
|
|
108
|
+
# Windows:
|
|
109
|
+
python.exe setup.py install --local="%cd%\..\python"
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
Alternative install with conda (for developing)
|
|
113
|
+
-----------------------------------------------
|
|
114
|
+
|
|
115
|
+
# Install the xnd package into a local directory.
|
|
116
|
+
|
|
117
|
+
# Create and activate a new conda environment:
|
|
118
|
+
conda create --name xnd python=3.7
|
|
119
|
+
conda activate xnd
|
|
120
|
+
|
|
121
|
+
# Use conda to install ndtypes (if you also want to work on ndtypes, please
|
|
122
|
+
# check the project repository https://github.com/plures/ndtypes):
|
|
123
|
+
conda install -c xnd/label/dev ndtypes
|
|
124
|
+
|
|
125
|
+
# Use conda to install numpy (optional, some tests require the library):
|
|
126
|
+
conda install numpy
|
|
127
|
+
|
|
128
|
+
# Use conda to build libxnd and xnd:
|
|
129
|
+
conda build .conda/libxnd -c xnd/label/dev
|
|
130
|
+
conda build .conda/xnd -c xnd/label/dev
|
|
131
|
+
|
|
132
|
+
# Use conda to install the local version of the library and the
|
|
133
|
+
# Python module:
|
|
134
|
+
conda install --use-local xnd
|