mirror of
https://github.com/janet-lang/janet
synced 2025-07-07 12:32:55 +00:00
Added tarray/slice and fix buffer size
This commit is contained in:
parent
632b920e97
commit
febfefa4b2
@ -59,11 +59,11 @@
|
|||||||
(matrix/print A)
|
(matrix/print A)
|
||||||
|
|
||||||
(loop (i :range (0 nr) j :range (0 nc))
|
(loop (i :range (0 nr) j :range (0 nc))
|
||||||
(matrix/set* A i j i)))
|
(matrix/set* A i j i))
|
||||||
(matrix/print A)
|
(matrix/print A)
|
||||||
|
|
||||||
(loop (i :range (0 nr) j :range (0 nc))
|
(loop (i :range (0 nr) j :range (0 nc))
|
||||||
(matrix/set** A i j i)))
|
(matrix/set** A i j i))
|
||||||
(matrix/print A)
|
(matrix/print A)
|
||||||
|
|
||||||
(print "tarray")
|
(print "tarray")
|
||||||
@ -84,3 +84,6 @@
|
|||||||
(printf "%p" (tarray/properties b))
|
(printf "%p" (tarray/properties b))
|
||||||
(print (b 0))
|
(print (b 0))
|
||||||
(print (b 1))
|
(print (b 1))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,6 +66,7 @@ static size_t ta_type_sizes[] = {
|
|||||||
sizeof(ta_int64_t),
|
sizeof(ta_int64_t),
|
||||||
sizeof(ta_float32_t),
|
sizeof(ta_float32_t),
|
||||||
sizeof(ta_float64_t),
|
sizeof(ta_float64_t),
|
||||||
|
0,
|
||||||
};
|
};
|
||||||
#define TA_COUNT_TYPES (JANET_TARRAY_TYPE_float64 + 1)
|
#define TA_COUNT_TYPES (JANET_TARRAY_TYPE_float64 + 1)
|
||||||
#define TA_ATOM_MAXSIZE 8
|
#define TA_ATOM_MAXSIZE 8
|
||||||
@ -211,8 +212,11 @@ void ta_put_##type(void *p, Janet key,Janet value) { \
|
|||||||
|
|
||||||
#define DEFINE_VIEW_INITIALIZER(thetype) \
|
#define DEFINE_VIEW_INITIALIZER(thetype) \
|
||||||
static JanetTArrayView * ta_init_##thetype(JanetTArrayView * view,JanetTArrayBuffer * buf,size_t size,size_t offset,size_t stride) { \
|
static JanetTArrayView * ta_init_##thetype(JanetTArrayView * view,JanetTArrayBuffer * buf,size_t size,size_t offset,size_t stride) { \
|
||||||
|
if ((stride<1) || (size <1)) { \
|
||||||
|
janet_panic("stride and size should be > 0"); \
|
||||||
|
}; \
|
||||||
TA_View_##thetype * tview=(TA_View_##thetype *) view; \
|
TA_View_##thetype * tview=(TA_View_##thetype *) view; \
|
||||||
size_t buf_size=offset+(size-1)*(sizeof(ta_##thetype##_t))*stride+1; \
|
size_t buf_size=offset+(sizeof(ta_##thetype##_t))*((size-1)*stride+1); \
|
||||||
if (buf==NULL) { \
|
if (buf==NULL) { \
|
||||||
buf=(JanetTArrayBuffer *)janet_abstract(&ta_buffer_type,sizeof(JanetTArrayBuffer)); \
|
buf=(JanetTArrayBuffer *)janet_abstract(&ta_buffer_type,sizeof(JanetTArrayBuffer)); \
|
||||||
ta_buffer_init(buf,buf_size); \
|
ta_buffer_init(buf,buf_size); \
|
||||||
@ -349,10 +353,6 @@ JanetTArrayView *janet_gettarray_view(const Janet *argv, int32_t n, JanetTArrayT
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static Janet cfun_typed_array_new(int32_t argc, Janet *argv) {
|
static Janet cfun_typed_array_new(int32_t argc, Janet *argv) {
|
||||||
janet_arity(argc, 2, 5);
|
janet_arity(argc, 2, 5);
|
||||||
size_t offset = 0;
|
size_t offset = 0;
|
||||||
@ -403,20 +403,27 @@ static Janet cfun_typed_array_size(int32_t argc, Janet *argv) {
|
|||||||
|
|
||||||
static Janet cfun_typed_array_properties(int32_t argc, Janet *argv) {
|
static Janet cfun_typed_array_properties(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 1);
|
janet_fixarity(argc, 1);
|
||||||
if (!is_ta_anytype(argv[0]))
|
if (is_ta_anytype(argv[0])) {
|
||||||
janet_panic("expected typed array");
|
JanetTArrayView *view = (JanetTArrayView *)janet_unwrap_abstract(argv[0]);
|
||||||
JanetTArrayView *view = (JanetTArrayView *)janet_unwrap_abstract(argv[0]);
|
JanetKV *props = janet_struct_begin(6);
|
||||||
JanetKV *props = janet_struct_begin(6);
|
janet_struct_put(props, janet_ckeywordv("size"), janet_wrap_number(view->size));
|
||||||
janet_struct_put(props, janet_ckeywordv("size"), janet_wrap_number(view->size));
|
janet_struct_put(props, janet_ckeywordv("byte-offset"), janet_wrap_number((uint8_t *)(view->data) - view->buffer->data));
|
||||||
janet_struct_put(props, janet_ckeywordv("byte-offset"), janet_wrap_number((uint8_t *)(view->data) - view->buffer->data));
|
janet_struct_put(props, janet_ckeywordv("stride"), janet_wrap_number(view->stride));
|
||||||
janet_struct_put(props, janet_ckeywordv("stride"), janet_wrap_number(view->stride));
|
janet_struct_put(props, janet_ckeywordv("type"), janet_ckeywordv(ta_type_names[view->type]));
|
||||||
janet_struct_put(props, janet_ckeywordv("type"), janet_ckeywordv(ta_type_names[view->type]));
|
janet_struct_put(props, janet_ckeywordv("type-size"), janet_wrap_number(ta_type_sizes[view->type]));
|
||||||
janet_struct_put(props, janet_ckeywordv("type-size"), janet_wrap_number(ta_type_sizes[view->type]));
|
janet_struct_put(props, janet_ckeywordv("buffer"), janet_wrap_abstract(view->buffer));
|
||||||
janet_struct_put(props, janet_ckeywordv("buffer"), janet_wrap_abstract(view->buffer));
|
return janet_wrap_struct(janet_struct_end(props));
|
||||||
return janet_wrap_struct(janet_struct_end(props));
|
} else {
|
||||||
|
JanetTArrayBuffer *buffer = janet_gettarray_buffer(argv, 0);
|
||||||
|
JanetKV *props = janet_struct_begin(3);
|
||||||
|
janet_struct_put(props, janet_ckeywordv("size"), janet_wrap_number(buffer->size));
|
||||||
|
janet_struct_put(props, janet_ckeywordv("big-endian"), janet_wrap_boolean(buffer->flags & TA_FLAG_BIG_ENDIAN));
|
||||||
|
return janet_wrap_struct(janet_struct_end(props));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO for test it's not the good place for this function */
|
/* TODO move it , it's not the good place for this function */
|
||||||
static Janet cfun_abstract_properties(int32_t argc, Janet *argv) {
|
static Janet cfun_abstract_properties(int32_t argc, Janet *argv) {
|
||||||
janet_fixarity(argc, 1);
|
janet_fixarity(argc, 1);
|
||||||
const uint8_t *key = janet_getkeyword(argv, 0);
|
const uint8_t *key = janet_getkeyword(argv, 0);
|
||||||
@ -430,6 +437,34 @@ static Janet cfun_abstract_properties(int32_t argc, Janet *argv) {
|
|||||||
return janet_wrap_struct(janet_struct_end(props));
|
return janet_wrap_struct(janet_struct_end(props));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Janet cfun_typed_array_slice(int32_t argc, Janet *argv) {
|
||||||
|
janet_arity(argc, 1, 3);
|
||||||
|
JanetTArrayView *src = janet_gettarray_view(argv, 0, JANET_TARRAY_TYPE_any);
|
||||||
|
const JanetAbstractType *at = janet_abstract_type(janet_unwrap_abstract(argv[0]));
|
||||||
|
JanetRange range;
|
||||||
|
int32_t length = (int32_t)src->size;
|
||||||
|
if (argc == 1) {
|
||||||
|
range.start = 0;
|
||||||
|
range.end = length;
|
||||||
|
} else if (argc == 2) {
|
||||||
|
range.start = janet_gethalfrange(argv, 1, length, "start");
|
||||||
|
range.end = length;
|
||||||
|
} else {
|
||||||
|
range.start = janet_gethalfrange(argv, 1, length, "start");
|
||||||
|
range.end = janet_gethalfrange(argv, 2, length, "end");
|
||||||
|
if (range.end < range.start)
|
||||||
|
range.end = range.start;
|
||||||
|
}
|
||||||
|
JanetArray *array = janet_array(range.end - range.start);
|
||||||
|
if (array->data) {
|
||||||
|
for (int32_t i = range.start; i < range.end; i++) {
|
||||||
|
array->data[i - range.start] = at->get(src, janet_wrap_number(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
array->count = range.end - range.start;
|
||||||
|
return janet_wrap_array(array);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static Janet cfun_typed_array_copy_bytes(int32_t argc, Janet *argv) {
|
static Janet cfun_typed_array_copy_bytes(int32_t argc, Janet *argv) {
|
||||||
janet_arity(argc, 4, 5);
|
janet_arity(argc, 4, 5);
|
||||||
@ -527,6 +562,14 @@ static const JanetReg ta_cfuns[] = {
|
|||||||
"memory can overlap"
|
"memory can overlap"
|
||||||
)
|
)
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"tarray/slice", cfun_typed_array_slice,
|
||||||
|
JDOC("(tarray/slice tarr [, start=0 [, end=(size tarr)]])\n\n"
|
||||||
|
"Takes a slice of typed array from start to end. The range is half"
|
||||||
|
"open, [start, end). Indexes can also be negative, indicating indexing"
|
||||||
|
"from the end of the end of the typed array. By default, start is 0 and end is"
|
||||||
|
"the size of the typed array. Returns a new janet array.")
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"abstract/properties", cfun_abstract_properties,
|
"abstract/properties", cfun_abstract_properties,
|
||||||
JDOC("(abstract/properties tag)\n\n"
|
JDOC("(abstract/properties tag)\n\n"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user