mirror of
https://github.com/janet-lang/janet
synced 2024-11-24 17:27:18 +00:00
added (u)int64 typed arrays back
This commit is contained in:
parent
5a9f7c3a85
commit
34849ea7b3
@ -156,19 +156,7 @@ static bi_uint64 check_bi_uint64(Janet x) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static Janet make_bi_int64(Janet x) {
|
||||
bi_int64 *box = (bi_int64 *)janet_abstract(&bi_int64_type, sizeof(bi_int64));
|
||||
*box = check_bi_int64(x);
|
||||
return janet_wrap_abstract(box);
|
||||
}
|
||||
|
||||
static Janet make_bi_uint64(Janet x) {
|
||||
bi_uint64 *box = (bi_uint64 *)janet_abstract(&bi_uint64_type, sizeof(bi_uint64));
|
||||
*box = check_bi_uint64(x);
|
||||
return janet_wrap_abstract(box);
|
||||
}
|
||||
|
||||
/* C API */
|
||||
|
||||
JanetBigintType janet_is_bigint(Janet x) {
|
||||
if (!janet_checktype(x, JANET_ABSTRACT)) return JANET_BIGINT_TYPE_none;
|
||||
@ -176,17 +164,38 @@ JanetBigintType janet_is_bigint(Janet x) {
|
||||
return (at == &bi_int64_type) ? JANET_BIGINT_TYPE_int64 : ((at == &bi_uint64_type) ? JANET_BIGINT_TYPE_uint64 : JANET_BIGINT_TYPE_none);
|
||||
}
|
||||
|
||||
Janet janet_bigint_int64(int64_t x) {
|
||||
bi_int64 *box = (bi_int64 *)janet_abstract(&bi_int64_type, sizeof(bi_int64));
|
||||
*box = (bi_int64)x;
|
||||
return janet_wrap_abstract(box);
|
||||
}
|
||||
|
||||
Janet janet_bigint_uint64(uint64_t x) {
|
||||
bi_uint64 *box = (bi_uint64 *)janet_abstract(&bi_uint64_type, sizeof(bi_uint64));
|
||||
*box = (bi_uint64)x;
|
||||
return janet_wrap_abstract(box);
|
||||
}
|
||||
|
||||
int64_t janet_checkbigint_int64(Janet x) {
|
||||
return (int64_t)check_bi_int64(x);
|
||||
}
|
||||
|
||||
uint64_t janet_checkbigint_uint64(Janet x) {
|
||||
return (uint64_t)check_bi_uint64(x);
|
||||
}
|
||||
|
||||
|
||||
static Janet cfun_bi_int64_new(int32_t argc, Janet *argv) {
|
||||
janet_fixarity(argc, 1);
|
||||
return make_bi_int64(argv[0]);
|
||||
return janet_bigint_int64(check_bi_int64(argv[0]));
|
||||
}
|
||||
|
||||
static Janet cfun_bi_uint64_new(int32_t argc, Janet *argv) {
|
||||
janet_fixarity(argc, 1);
|
||||
return make_bi_uint64(argv[0]);
|
||||
return janet_bigint_uint64(check_bi_uint64(argv[0]));
|
||||
}
|
||||
|
||||
|
||||
#define OPMETHOD(type,name,oper) \
|
||||
static Janet cfun_##type##_##name(int32_t argc, Janet *argv) { \
|
||||
janet_arity(argc, 2, -1); \
|
||||
|
@ -37,6 +37,10 @@ typedef uint32_t ta_uint32_t;
|
||||
typedef int32_t ta_int32_t;
|
||||
typedef float ta_float32_t;
|
||||
typedef double ta_float64_t;
|
||||
#ifdef JANET_BIGINT
|
||||
typedef uint64_t ta_uint64_t;
|
||||
typedef int64_t ta_int64_t;
|
||||
#endif
|
||||
|
||||
static char *ta_type_names[] = {
|
||||
"uint8",
|
||||
@ -45,6 +49,10 @@ static char *ta_type_names[] = {
|
||||
"int16",
|
||||
"uint32",
|
||||
"int32",
|
||||
#ifdef JANET_BIGINT
|
||||
"uint64",
|
||||
"int64",
|
||||
#endif
|
||||
"float32",
|
||||
"float64",
|
||||
"any"
|
||||
@ -57,6 +65,10 @@ static size_t ta_type_sizes[] = {
|
||||
sizeof(ta_int16_t),
|
||||
sizeof(ta_uint32_t),
|
||||
sizeof(ta_int32_t),
|
||||
#ifdef JANET_BIGINT
|
||||
sizeof(ta_uint64_t),
|
||||
sizeof(ta_int64_t),
|
||||
#endif
|
||||
sizeof(ta_float32_t),
|
||||
sizeof(ta_float64_t),
|
||||
0
|
||||
@ -191,6 +203,23 @@ static Janet ta_get_##type(void *p, Janet key) { \
|
||||
return value; \
|
||||
}
|
||||
|
||||
#define DEFINE_VIEW_GETTER_BIGINT(type) \
|
||||
static Janet ta_get_##type(void *p, Janet key) { \
|
||||
Janet value; \
|
||||
size_t index; \
|
||||
if (!janet_checksize(key)) \
|
||||
janet_panic("expected size as key"); \
|
||||
index = (size_t)janet_unwrap_number(key);\
|
||||
TA_View_##type *array=(TA_View_##type *)p; \
|
||||
if (index >= array->size) { \
|
||||
value = janet_wrap_nil(); \
|
||||
} else { \
|
||||
value = janet_bigint_##type(array->data[index*array->stride]); \
|
||||
} \
|
||||
return value; \
|
||||
}
|
||||
|
||||
|
||||
#define DEFINE_VIEW_SETTER(type) \
|
||||
void ta_put_##type(void *p, Janet key,Janet value) { \
|
||||
size_t index;\
|
||||
@ -206,6 +235,20 @@ void ta_put_##type(void *p, Janet key,Janet value) { \
|
||||
array->data[index*array->stride]=(ta_##type##_t)janet_unwrap_number(value); \
|
||||
}
|
||||
|
||||
#define DEFINE_VIEW_SETTER_BIGINT(type) \
|
||||
void ta_put_##type(void *p, Janet key,Janet value) { \
|
||||
size_t index;\
|
||||
if (!janet_checksize(key))\
|
||||
janet_panic("expected size as key"); \
|
||||
index = (size_t)janet_unwrap_number(key); \
|
||||
TA_View_##type *array=(TA_View_##type *)p; \
|
||||
if (index >= array->size) { \
|
||||
janet_panic("index out of bounds"); \
|
||||
} \
|
||||
array->data[index*array->stride]=(ta_##type##_t)janet_checkbigint_##type(value); \
|
||||
}
|
||||
|
||||
|
||||
#define DEFINE_VIEW_INITIALIZER(thetype) \
|
||||
static JanetTArrayView *ta_init_##thetype(JanetTArrayView *view, \
|
||||
JanetTArrayBuffer *buf, size_t size, \
|
||||
@ -236,18 +279,30 @@ DEFINE_VIEW_GETTER(type) \
|
||||
DEFINE_VIEW_SETTER(type) \
|
||||
DEFINE_VIEW_INITIALIZER(type)
|
||||
|
||||
#define BUILD_TYPE_BIGINT(type) \
|
||||
DEFINE_VIEW_TYPE(type) \
|
||||
DEFINE_VIEW_GETTER_BIGINT(type) \
|
||||
DEFINE_VIEW_SETTER_BIGINT(type) \
|
||||
DEFINE_VIEW_INITIALIZER(type)
|
||||
|
||||
BUILD_TYPE(uint8)
|
||||
BUILD_TYPE(int8)
|
||||
BUILD_TYPE(uint16)
|
||||
BUILD_TYPE(int16)
|
||||
BUILD_TYPE(uint32)
|
||||
BUILD_TYPE(int32)
|
||||
#ifdef JANET_BIGINT
|
||||
BUILD_TYPE_BIGINT(uint64)
|
||||
BUILD_TYPE_BIGINT(int64)
|
||||
#endif
|
||||
BUILD_TYPE(float32)
|
||||
BUILD_TYPE(float64)
|
||||
|
||||
#undef DEFINE_VIEW_TYPE
|
||||
#undef DEFINE_VIEW_GETTER
|
||||
#undef DEFINE_VIEW_SETTER
|
||||
#undef DEFINE_VIEW_GETTER_BIGINT
|
||||
#undef DEFINE_VIEW_SETTER_BIGINT
|
||||
#undef DEFINE_VIEW_INITIALIZER
|
||||
|
||||
#define DEFINE_VIEW_ABSTRACT_TYPE(type) \
|
||||
@ -268,6 +323,10 @@ static const JanetAbstractType ta_array_types[] = {
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(int16),
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(uint32),
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(int32),
|
||||
#ifdef JANET_BIGINT
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(uint64),
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(int64),
|
||||
#endif
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(float32),
|
||||
DEFINE_VIEW_ABSTRACT_TYPE(float64)
|
||||
};
|
||||
@ -308,6 +367,10 @@ JanetTArrayView *janet_tarray_view(JanetTArrayType type, size_t size, size_t str
|
||||
CASE_TYPE_INITIALIZE(int16);
|
||||
CASE_TYPE_INITIALIZE(uint32);
|
||||
CASE_TYPE_INITIALIZE(int32);
|
||||
#ifdef JANET_BIGINT
|
||||
CASE_TYPE_INITIALIZE(uint64);
|
||||
CASE_TYPE_INITIALIZE(int64);
|
||||
#endif
|
||||
CASE_TYPE_INITIALIZE(float32);
|
||||
CASE_TYPE_INITIALIZE(float64);
|
||||
default :
|
||||
|
@ -1293,6 +1293,10 @@ typedef enum {
|
||||
JANET_TARRAY_TYPE_int16,
|
||||
JANET_TARRAY_TYPE_uint32,
|
||||
JANET_TARRAY_TYPE_int32,
|
||||
#ifdef JANET_BIGINT
|
||||
JANET_TARRAY_TYPE_uint64,
|
||||
JANET_TARRAY_TYPE_int64,
|
||||
#endif
|
||||
JANET_TARRAY_TYPE_float32,
|
||||
JANET_TARRAY_TYPE_float64,
|
||||
JANET_TARRAY_TYPE_any,
|
||||
@ -1330,7 +1334,10 @@ typedef enum {
|
||||
} JanetBigintType;
|
||||
|
||||
JANET_API JanetBigintType janet_is_bigint(Janet x);
|
||||
|
||||
JANET_API Janet janet_bigint_int64(int64_t x);
|
||||
JANET_API Janet janet_bigint_uint64(uint64_t x);
|
||||
JANET_API int64_t janet_checkbigint_int64(Janet x);
|
||||
JANET_API uint64_t janet_checkbigint_uint64(Janet x);
|
||||
#endif
|
||||
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user