📄 gbx_c_array.c
字号:
#define IMPLEMENT_put(_type, _gtype) \BEGIN_METHOD(CARRAY_##_type##_put, GB_##_gtype value; GB_INTEGER index) \\ void *data = get_data(THIS, VARG(index)); \ if (!data) return; \ GB_Store(GB_T_##_gtype, (GB_VALUE *)ARG(value), data); \ \END_METHOD#define IMPLEMENT_put2(_type, _gtype, _gstore) \BEGIN_METHOD(CARRAY_##_type##_put, GB_##_gtype value; GB_INTEGER index) \\ void *data = get_data(THIS, VARG(index)); \ if (!data) return; \ GB_Store(GB_T_##_gstore, (GB_VALUE *)ARG(value), data); \ \END_METHODIMPLEMENT_put(integer, INTEGER)IMPLEMENT_put2(short, INTEGER, SHORT)IMPLEMENT_put2(byte, INTEGER, BYTE)IMPLEMENT_put(float, FLOAT)IMPLEMENT_put(date, DATE)IMPLEMENT_put(string, STRING)IMPLEMENT_put(object, OBJECT)IMPLEMENT_put(variant, VARIANT)BEGIN_METHOD(CARRAY_insert, GB_OBJECT array; GB_INTEGER pos) long pos = VARGOPT(pos, -1); CARRAY *array = (CARRAY *)VARG(array); int count = ARRAY_count(array->data); void *data; if (count <= 0) return; if (pos < 0) pos = ARRAY_count(THIS->data); data = ARRAY_insert_many(&THIS->data, pos, count); borrow(array, 0, -1); memmove(data, array->data, count * TYPE_sizeof_memory(THIS->type));END_METHODBEGIN_METHOD(CARRAY_copy, GB_INTEGER start; GB_INTEGER length) CARRAY *array; int count = ARRAY_count(THIS->data); void *data; int start = VARGOPT(start, 0); int length = VARGOPT(length, -1); if (start < 0 || start >= count) { GB_Error((char *)E_BOUND); return; } if (length == -1) length = count - start; if (length < 0 || (start + length) > count) { GB_Error((char *)E_BOUND); return; } GB_ArrayNew((GB_ARRAY)&array, THIS->type, 0); if (length > 0) { data = ARRAY_insert_many(&array->data, 0, length); memmove(data, get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type)); borrow(array, 0, -1); } GB_ReturnObject(array);END_METHODBEGIN_METHOD_VOID(CARRAY_pop) long index = ARRAY_count(THIS->data) - 1; if (index < 0) { GB_Error((char *)E_ARG); return; } GB_ReturnPtr(THIS->type, get_data(THIS, index)); BORROW(&TEMP); release_one(THIS, index); ARRAY_remove(&THIS->data, index); UNBORROW(&TEMP);END_METHODBEGIN_METHOD(CARRAY_get, GB_INTEGER index) void *data = get_data(THIS, VARG(index)); if (data) GB_ReturnPtr(THIS->type, data);END_METHODBEGIN_METHOD_VOID(CARRAY_next) long *index = (long *)GB_GetEnum(); if (*index >= ARRAY_count(THIS->data)) GB_StopEnum(); else { GB_ReturnPtr(THIS->type, get_data(THIS, *index)); (*index)++; }END_METHODBEGIN_METHOD(CARRAY_sort, GB_INTEGER mode) COMPARE_FUNC compare; long mode = VARGOPT(mode, 0); void *data = THIS->data; if (ARRAY_count(data) <= 1) return; compare = COMPARE_get(THIS->type, mode); qsort(data, ARRAY_count(data), TYPE_sizeof_memory(THIS->type), compare);END_METHODPRIVATE void find(CARRAY *_object, int mode, void *value){ COMPARE_FUNC compare = COMPARE_get(THIS->type, mode); int i; for (i = 0; i < ARRAY_count(THIS->data); i++) { if ((*compare)(value, get_data(THIS, i)) == 0) { GB_ReturnInt(i); return; } } GB_ReturnInt(-1);}#define IMPLEMENT_find(_type, _gtype) \BEGIN_METHOD(CARRAY_##_type##_find, _gtype value; GB_INTEGER mode) \\ find(THIS, VARGOPT(mode, 0), &VARG(value)); \\END_METHODIMPLEMENT_find(integer, GB_INTEGER)IMPLEMENT_find(short, GB_INTEGER)IMPLEMENT_find(byte, GB_INTEGER)IMPLEMENT_find(float, GB_FLOAT)IMPLEMENT_find(date, GB_DATE)IMPLEMENT_find(object, GB_OBJECT)BEGIN_METHOD(CARRAY_string_find, GB_STRING value; GB_INTEGER mode) char *str = GB_ToZeroString(ARG(value)); find(THIS, VARGOPT(mode, 0), &str);END_METHODBEGIN_METHOD(CARRAY_string_join, GB_STRING sep) char *sep = ","; char *res = NULL; int i; char **data = (char **)THIS->data; if (!MISSING(sep)) sep = GB_ToZeroString(ARG(sep)); for (i = 0; i < ARRAY_count(data); i++) { if (i) STRING_add(&res, sep, 0); STRING_add(&res, data[i], STRING_length(data[i])); } if (res) { STRING_extend_end(&res); GB_ReturnString(res); } else GB_ReturnNull();END_METHODBEGIN_METHOD_VOID(CARRAY_reverse) size_t size; long count; char *buffer[16]; char *pi, *pj; count = ARRAY_count(THIS->data); if (count <= 1) return; size = TYPE_sizeof_memory(THIS->type); pi = get_data(THIS, 0); pj = get_data(THIS, count - 1); do { memcpy(buffer, pi, size); memcpy(pi, pj, size); memcpy(pj, buffer, size); pi += size; pj -= size; } while (pi < pj);END_METHODBEGIN_METHOD(CARRAY_read, GB_OBJECT file; GB_INTEGER start; GB_INTEGER length) long count = ARRAY_count(THIS->data); long start = VARGOPT(start, 0); long length = VARGOPT(length, count); if ((start + length) > count) length = count - start; STREAM_read(CSTREAM_stream(VARG(file)), get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type));END_METHODBEGIN_METHOD(CARRAY_write, GB_OBJECT file; GB_INTEGER start; GB_INTEGER length) long count = ARRAY_count(THIS->data); long start = VARGOPT(start, 0); long length = VARGOPT(length, count); if ((start + length) > count) length = count - start; STREAM_write(CSTREAM_stream(VARG(file)), get_data(THIS, start), length * TYPE_sizeof_memory(THIS->type));END_METHODPUBLIC GB_DESC NATIVE_Array[] ={ GB_DECLARE(".Array", sizeof(CARRAY)), GB_NOT_CREATABLE(), GB_METHOD("_free", NULL, CARRAY_free, NULL), GB_PROPERTY_READ("Count", "i", CARRAY_count), GB_PROPERTY_READ("Max", "i", CARRAY_max), GB_PROPERTY_READ("Length", "i", CARRAY_count), GB_METHOD("Remove", NULL, CARRAY_remove, "(Index)i[(Count)i]"), GB_METHOD("Clear", NULL, CARRAY_clear, NULL), GB_METHOD("Resize", NULL, CARRAY_resize, "(Size)i"), GB_METHOD("Sort", NULL, CARRAY_sort, "[(Mode)i]"), GB_METHOD("Reverse", NULL, CARRAY_reverse, NULL), //GB_METHOD("FromString", "i", CARRAY_from_string, "(String)s[(Separator)s(Escape)s]"), //GB_METHOD("Sort", NULL, CARRAY_sort, "[(Compare)i]"), //GB_METHOD("Find", "i", CARRAY_find, "(Value)s[(Compare)i]"), GB_END_DECLARE};PUBLIC GB_DESC NATIVE_IntegerArray[] ={ GB_DECLARE("Integer[]", sizeof(CARRAY)), GB_INHERITS(".Array"), GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"), GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"), GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"), GB_METHOD("_put", NULL, CARRAY_integer_put, "(Value)i(Index)i"), GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"), GB_METHOD("Pop", "i", CARRAY_pop, NULL), GB_METHOD("_get", "i", CARRAY_get, "(Index)i"), GB_METHOD("_next", "i", CARRAY_next, NULL), GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Integer[];[(Pos)i]"), GB_METHOD("Copy", "Integer[]", CARRAY_copy, "[(Start)i(Length)i]"), //GB_METHOD("Extract", NULL, CARRAY_extract, "(Start)i[(Length)i]"), GB_END_DECLARE};PUBLIC GB_DESC NATIVE_ShortArray[] ={ GB_DECLARE("Short[]", sizeof(CARRAY)), GB_INHERITS(".Array"), GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"), GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"), GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"), GB_METHOD("_put", NULL, CARRAY_short_put, "(Value)i(Index)i"), GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"), GB_METHOD("Pop", "i", CARRAY_pop, NULL), GB_METHOD("_get", "i", CARRAY_get, "(Index)i"), GB_METHOD("_next", "i", CARRAY_next, NULL), GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Short[];[(Pos)i]"), GB_METHOD("Copy", "Short[]", CARRAY_copy, "[(Start)i(Length)i]"), GB_END_DECLARE};PUBLIC GB_DESC NATIVE_ByteArray[] ={ GB_DECLARE("Byte[]", sizeof(CARRAY)), GB_INHERITS(".Array"), GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"), GB_METHOD("Add", NULL, CARRAY_integer_add, "(Value)i[(Index)i]"), GB_METHOD("Push", NULL, CARRAY_integer_push, "(Value)i"), GB_METHOD("_put", NULL, CARRAY_byte_put, "(Value)i(Index)i"), GB_METHOD("Find", "i", CARRAY_integer_find, "(Value)i[(Mode)i]"), GB_METHOD("Pop", "i", CARRAY_pop, NULL), GB_METHOD("_get", "i", CARRAY_get, "(Index)i"), GB_METHOD("_next", "i", CARRAY_next, NULL), GB_METHOD("Read", NULL, CARRAY_read, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Write", NULL, CARRAY_write, "(File)File;[(Start)i(Length)i]"), GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)Byte[];[(Pos)i]"), GB_METHOD("Copy", "Byte[]", CARRAY_copy, "[(Start)i(Length)i]"), GB_END_DECLARE};PUBLIC GB_DESC NATIVE_StringArray[] ={ GB_DECLARE("String[]", sizeof(CARRAY)), GB_INHERITS(".Array"), GB_METHOD("_new", NULL, CARRAY_new, "[(Size)i]"), GB_METHOD("Add", NULL, CARRAY_string_add, "(Value)s[(Index)i]"), GB_METHOD("Push", NULL, CARRAY_string_push, "(Value)s"), GB_METHOD("_put", NULL, CARRAY_string_put, "(Value)s(Index)i"), GB_METHOD("Find", "i", CARRAY_string_find, "(Value)s[(Mode)i]"), GB_METHOD("Pop", "s", CARRAY_pop, NULL), GB_METHOD("_get", "s", CARRAY_get, "(Index)i"), GB_METHOD("_next", "s", CARRAY_next, NULL), GB_METHOD("Insert", NULL, CARRAY_insert, "(Array)String[];[(Pos)i]"), GB_METHOD("Join", "s", CARRAY_string_join, "[(Separator)s]"), /* Inutile ! NE sert qu'
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -