3 #include "testing/testing.h"
23 static void print_mem_saved(
const char *
id,
const BArrayStore *bs)
27 const double percent = size_expand ? ((size_real / size_expand) * 100.0) : -1.0;
28 printf(
"%s: %.8f%%\n",
id, percent);
71 static char *testchunk_as_data(
ListBase *lb,
size_t *r_data_len)
80 memcpy(&
data[i], tc->data, tc->data_len);
94 for (
int tc_index = 0; tc_index < tc_array_len; tc_index++) {
99 for (
int tc_index = 0; tc_index < tc_array_len; tc_index++) {
159 char *data_stride = (
char *)
MEM_mallocN(data_stride_len, __func__);
161 for (
size_t i = 0, i_stride = 0; i <
data_len; i += 1, i_stride +=
stride) {
162 memset(&data_stride[i_stride],
data[i],
stride);
169 #define testbuffer_list_state_from_string_array(lb, data_array) \
171 unsigned int i_ = 0; \
173 while ((data = data_array[i_++])) { \
174 testbuffer_list_state_from_data(lb, data, strlen(data)); \
181 #define TESTBUFFER_STRINGS_CREATE(lb, ...) \
183 BLI_listbase_clear(lb); \
184 const char *data_array[] = {__VA_ARGS__ NULL}; \
185 testbuffer_list_state_from_string_array((lb), data_array); \
190 #define TESTBUFFER_STRINGS_EX(bs, ...) \
193 TESTBUFFER_STRINGS_CREATE(&lb, __VA_ARGS__); \
195 testbuffer_run_tests(bs, &lb); \
197 testbuffer_list_free(&lb); \
201 #define TESTBUFFER_STRINGS(stride, chunk_count, ...) \
204 TESTBUFFER_STRINGS_CREATE(&lb, __VA_ARGS__); \
206 testbuffer_run_tests_simple(&lb, stride, chunk_count); \
208 testbuffer_list_free(&lb); \
214 size_t data_state_len;
217 if (tb->
data_len != data_state_len) {
220 else if (memcmp(data_state, tb->
data, data_state_len) != 0) {
248 tb_prev = tb, tb = tb->next) {
250 bs, tb->data, tb->data_len, (tb_prev ? tb_prev->state :
nullptr));
278 print_mem_saved(
"data", bs);
315 const unsigned char data[] =
"test";
325 const char data_src[] =
"test";
326 const char *data_dst;
330 EXPECT_STREQ(data_src, data_dst);
331 EXPECT_EQ(data_dst_len,
sizeof(data_src));
339 const char data_src[] =
"test";
340 const char *data_dst;
351 EXPECT_STREQ(data_src, data_dst);
355 EXPECT_STREQ(data_src, data_dst);
358 EXPECT_EQ(data_dst_len,
sizeof(data_src));
365 const char data_src_a[] =
"test";
366 const char data_src_b[] =
"####";
367 const char *data_dst;
377 EXPECT_STREQ(data_src_a, data_dst);
381 EXPECT_STREQ(data_src_b, data_dst);
397 TEST(array_store, TextDupeIncreaseDecrease)
437 const char word_delim,
439 const int chunk_count,
440 const int random_seed)
446 for (
int i = 0, i_prev = 0; i < words_len; i++) {
447 if (
ELEM(words[i], word_delim,
'\0')) {
465 #define WORDS words10k, sizeof(words10k)
466 TEST(array_store, TextSentences_Chunk1)
470 TEST(array_store, TextSentences_Chunk2)
474 TEST(array_store, TextSentences_Chunk8)
478 TEST(array_store, TextSentences_Chunk32)
482 TEST(array_store, TextSentences_Chunk128)
486 TEST(array_store, TextSentences_Chunk1024)
491 TEST(array_store, TextSentences_Chunk3)
495 TEST(array_store, TextSentences_Chunk13)
499 TEST(array_store, TextSentences_Chunk131)
505 TEST(array_store, TextWords_Chunk1)
509 TEST(array_store, TextWords_Chunk2)
513 TEST(array_store, TextWords_Chunk8)
517 TEST(array_store, TextWords_Chunk32)
521 TEST(array_store, TextWords_Chunk128)
525 TEST(array_store, TextWords_Chunk1024)
530 TEST(array_store, TextWords_Chunk3)
534 TEST(array_store, TextWords_Chunk13)
538 TEST(array_store, TextWords_Chunk131)
544 TEST(array_store, TextSentencesRandom_Stride3_Chunk3)
548 TEST(array_store, TextSentencesRandom_Stride8_Chunk8)
552 TEST(array_store, TextSentencesRandom_Stride32_Chunk1)
556 TEST(array_store, TextSentencesRandom_Stride12_Chunk512)
560 TEST(array_store, TextSentencesRandom_Stride128_Chunk6)
582 value = (value / step) * step;
583 return min_i + value;
588 const size_t data_min_len,
589 const size_t data_max_len,
591 const unsigned int mutate,
597 if (lb->
last ==
nullptr) {
611 for (
int i = 0; i < mutate; i++) {
635 case MUTATE_REMOVE: {
643 case MUTATE_ROTATE: {
650 case MUTATE_RANDOMIZE: {
667 const int items_size_max,
668 const int items_total,
670 const int chunk_count,
671 const int random_seed,
678 const size_t data_min_len = items_size_min *
stride;
679 const size_t data_max_len = items_size_max *
stride;
683 for (
int i = 0; i < items_total; i++) {
694 TEST(array_store, TestData_Stride1_Chunk32_Mutate2)
698 TEST(array_store, TestData_Stride8_Chunk512_Mutate2)
702 TEST(array_store, TestData_Stride12_Chunk48_Mutate2)
706 TEST(array_store, TestData_Stride32_Chunk64_Mutate1)
710 TEST(array_store, TestData_Stride32_Chunk64_Mutate8)
719 const int chunks_per_buffer,
721 const int chunk_count,
722 const int random_seed)
725 const size_t chunk_size_bytes =
stride * chunk_count;
726 for (
int i = 0; i < chunks_per_buffer; i++) {
727 char *data_chunk = (
char *)
MEM_mallocN(chunk_size_bytes, __func__);
738 const int items_total,
740 const int chunk_count,
741 const int random_seed)
752 for (
int i = 0; i < chunks_per_buffer; i++, tc = tc->
next) {
753 chunks_array[i] = tc;
763 for (
int i = 0; i < items_total; i++) {
779 size_t expected_size = chunks_per_buffer * chunk_count *
stride;
787 TEST(array_store, TestChunk_Rand8_Stride1_Chunk64)
791 TEST(array_store, TestChunk_Rand32_Stride1_Chunk64)
795 TEST(array_store, TestChunk_Rand64_Stride8_Chunk32)
799 TEST(array_store, TestChunk_Rand31_Stride11_Chunk21)
809 void *file_read_binary_as_mem(
const char *filepath,
size_t pad_bytes,
size_t *r_size)
811 FILE *fp = fopen(filepath,
"rb");
815 long int filelen_read;
816 fseek(fp, 0
L, SEEK_END);
817 const long int filelen = ftell(fp);
821 fseek(fp, 0
L, SEEK_SET);
828 filelen_read = fread(mem, 1, filelen, fp);
829 if ((filelen_read != filelen) || ferror(fp)) {
835 *r_size = filelen_read;
844 TEST(array_store, PlainTextFiles)
850 for (
int i = 0; i < 629; i++) {
867 print_mem_saved(
"source code forward", bs);
878 print_mem_saved(
"source code backwards", bs);
Efficient in-memory storage of multiple similar arrays.
void * BLI_array_store_state_data_get_alloc(BArrayState *state, size_t *r_data_len)
void BLI_array_store_state_remove(BArrayStore *bs, BArrayState *state)
size_t BLI_array_store_calc_size_expanded_get(const BArrayStore *bs)
BArrayStore * BLI_array_store_create(unsigned int stride, unsigned int chunk_count)
bool BLI_array_store_is_valid(BArrayStore *bs)
BArrayState * BLI_array_store_state_add(BArrayStore *bs, const void *data, const size_t data_len, const BArrayState *state_reference)
size_t BLI_array_store_state_size_get(BArrayState *state)
void BLI_array_store_destroy(BArrayStore *bs)
size_t BLI_array_store_calc_size_compacted_get(const BArrayStore *bs)
static void random_data_mutate_helper(const int items_size_min, const int items_size_max, const int items_total, const int stride, const int chunk_count, const int random_seed, const int mutate)
#define TESTBUFFER_STRINGS(stride, chunk_count,...)
static void testbuffer_list_state_from_data__stride_expand(ListBase *lb, const char *data, const size_t data_len, const size_t stride)
#define TESTBUFFER_STRINGS_CREATE(lb,...)
static void testbuffer_list_store_populate(BArrayStore *bs, ListBase *lb)
static void testbuffer_list_store_clear(BArrayStore *bs, ListBase *lb)
static bool testbuffer_item_validate(TestBuffer *tb)
static void testbuffer_list_data_randomize(ListBase *lb, unsigned int random_seed)
static TestBuffer * testbuffer_list_add(ListBase *lb, const void *data, size_t data_len)
static void testbuffer_list_state_random_data(ListBase *lb, const size_t stride, const size_t data_min_len, const size_t data_max_len, const unsigned int mutate, RNG *rng)
static unsigned int rand_range_i(RNG *rng, unsigned int min_i, unsigned int max_i, unsigned int step)
static TestChunk * testchunk_list_add(ListBase *lb, const void *data, size_t data_len)
static void random_chunk_mutate_helper(const int chunks_per_buffer, const int items_total, const int stride, const int chunk_count, const int random_seed)
static void testbuffer_run_tests(BArrayStore *bs, ListBase *lb)
static TestBuffer * testbuffer_list_add_copydata(ListBase *lb, const void *data, size_t data_len)
static void testchunk_list_free(ListBase *lb)
static void testbuffer_run_tests_single(BArrayStore *bs, ListBase *lb)
static bool testbuffer_list_validate(const ListBase *lb)
static void random_chunk_generate(ListBase *lb, const int chunks_per_buffer, const int stride, const int chunk_count, const int random_seed)
static void testbuffer_list_state_from_data(ListBase *lb, const char *data, const size_t data_len)
static void plain_text_helper(const char *words, int words_len, const char word_delim, const int stride, const int chunk_count, const int random_seed)
static void testbuffer_run_tests_simple(ListBase *lb, const int stride, const int chunk_count)
static void testbuffer_list_free(ListBase *lb)
static char * testchunk_as_data_array(TestChunk **tc_array, int tc_array_len, size_t *r_data_len)
Generic array manipulation API.
void _bli_array_wrap(void *arr, unsigned int arr_len, size_t arr_stride, int dir)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BLI_INLINE void BLI_listbase_clear(struct ListBase *lb)
void BLI_addtail(struct ListBase *listbase, void *vlink) ATTR_NONNULL(1)
void void void void void void BLI_listbase_reverse(struct ListBase *lb) ATTR_NONNULL(1)
void BLI_rng_free(struct RNG *rng) ATTR_NONNULL(1)
unsigned int BLI_rng_get_uint(struct RNG *rng) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
struct RNG * BLI_rng_new(unsigned int seed)
void BLI_rng_get_char_n(RNG *rng, char *bytes, size_t bytes_len) ATTR_NONNULL(1
void BLI_array_randomize(void *data, unsigned int elem_size, unsigned int elem_tot, unsigned int seed)
void BLI_rng_shuffle_array(struct RNG *rng, void *data, unsigned int elem_size_i, unsigned int elem_tot) ATTR_NONNULL(1
size_t BLI_snprintf(char *__restrict dst, size_t maxncpy, const char *__restrict format,...) ATTR_NONNULL(1
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei stride
Read Guarded memory(de)allocation.
#define MEM_reallocN(vmemh, len)
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)