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(stride, chunk_count, ...) \
193 TESTBUFFER_STRINGS_CREATE(&lb, __VA_ARGS__); \
195 testbuffer_run_tests_simple(&lb, stride, chunk_count); \
197 testbuffer_list_free(&lb); \
203 size_t data_state_len;
206 if (tb->
data_len != data_state_len) {
209 else if (memcmp(data_state, tb->
data, data_state_len) != 0) {
237 tb_prev = tb, tb = tb->next) {
239 bs, tb->data, tb->data_len, (tb_prev ? tb_prev->state :
nullptr));
267 print_mem_saved(
"data", bs);
304 const unsigned char data[] =
"test";
314 const char data_src[] =
"test";
315 const char *data_dst;
319 EXPECT_STREQ(data_src, data_dst);
320 EXPECT_EQ(data_dst_len,
sizeof(data_src));
328 const char data_src[] =
"test";
329 const char *data_dst;
340 EXPECT_STREQ(data_src, data_dst);
344 EXPECT_STREQ(data_src, data_dst);
347 EXPECT_EQ(data_dst_len,
sizeof(data_src));
354 const char data_src_a[] =
"test";
355 const char data_src_b[] =
"####";
356 const char *data_dst;
366 EXPECT_STREQ(data_src_a, data_dst);
370 EXPECT_STREQ(data_src_b, data_dst);
386 TEST(array_store, TextDupeIncreaseDecrease)
426 const char word_delim,
428 const int chunk_count,
429 const int random_seed)
435 for (
int i = 0, i_prev = 0; i < words_len; i++) {
436 if (
ELEM(words[i], word_delim,
'\0')) {
454 #define WORDS words10k, sizeof(words10k)
455 TEST(array_store, TextSentences_Chunk1)
459 TEST(array_store, TextSentences_Chunk2)
463 TEST(array_store, TextSentences_Chunk8)
467 TEST(array_store, TextSentences_Chunk32)
471 TEST(array_store, TextSentences_Chunk128)
475 TEST(array_store, TextSentences_Chunk1024)
480 TEST(array_store, TextSentences_Chunk3)
484 TEST(array_store, TextSentences_Chunk13)
488 TEST(array_store, TextSentences_Chunk131)
494 TEST(array_store, TextWords_Chunk1)
498 TEST(array_store, TextWords_Chunk2)
502 TEST(array_store, TextWords_Chunk8)
506 TEST(array_store, TextWords_Chunk32)
510 TEST(array_store, TextWords_Chunk128)
514 TEST(array_store, TextWords_Chunk1024)
519 TEST(array_store, TextWords_Chunk3)
523 TEST(array_store, TextWords_Chunk13)
527 TEST(array_store, TextWords_Chunk131)
533 TEST(array_store, TextSentencesRandom_Stride3_Chunk3)
537 TEST(array_store, TextSentencesRandom_Stride8_Chunk8)
541 TEST(array_store, TextSentencesRandom_Stride32_Chunk1)
545 TEST(array_store, TextSentencesRandom_Stride12_Chunk512)
549 TEST(array_store, TextSentencesRandom_Stride128_Chunk6)
571 value = (value / step) * step;
572 return min_i + value;
577 const size_t data_min_len,
578 const size_t data_max_len,
580 const unsigned int mutate,
586 if (lb->
last ==
nullptr) {
600 for (
int i = 0; i < mutate; i++) {
624 case MUTATE_REMOVE: {
632 case MUTATE_ROTATE: {
639 case MUTATE_RANDOMIZE: {
656 const int items_size_max,
657 const int items_total,
659 const int chunk_count,
660 const int random_seed,
667 const size_t data_min_len = items_size_min *
stride;
668 const size_t data_max_len = items_size_max *
stride;
672 for (
int i = 0; i < items_total; i++) {
683 TEST(array_store, TestData_Stride1_Chunk32_Mutate2)
687 TEST(array_store, TestData_Stride8_Chunk512_Mutate2)
691 TEST(array_store, TestData_Stride12_Chunk48_Mutate2)
695 TEST(array_store, TestData_Stride32_Chunk64_Mutate1)
699 TEST(array_store, TestData_Stride32_Chunk64_Mutate8)
708 const int chunks_per_buffer,
710 const int chunk_count,
711 const int random_seed)
714 const size_t chunk_size_bytes =
stride * chunk_count;
715 for (
int i = 0; i < chunks_per_buffer; i++) {
716 char *data_chunk = (
char *)
MEM_mallocN(chunk_size_bytes, __func__);
727 const int items_total,
729 const int chunk_count,
730 const int random_seed)
741 for (
int i = 0; i < chunks_per_buffer; i++, tc = tc->
next) {
742 chunks_array[i] = tc;
752 for (
int i = 0; i < items_total; i++) {
768 size_t expected_size = chunks_per_buffer * chunk_count *
stride;
776 TEST(array_store, TestChunk_Rand8_Stride1_Chunk64)
780 TEST(array_store, TestChunk_Rand32_Stride1_Chunk64)
784 TEST(array_store, TestChunk_Rand64_Stride8_Chunk32)
788 TEST(array_store, TestChunk_Rand31_Stride11_Chunk21)
798 void *file_read_binary_as_mem(
const char *filepath,
size_t pad_bytes,
size_t *r_size)
800 FILE *fp = fopen(filepath,
"rb");
804 long int filelen_read;
805 fseek(fp, 0
L, SEEK_END);
806 const long int filelen = ftell(fp);
810 fseek(fp, 0
L, SEEK_SET);
817 filelen_read = fread(mem, 1, filelen, fp);
818 if ((filelen_read != filelen) || ferror(fp)) {
824 *r_size = filelen_read;
833 TEST(array_store, PlainTextFiles)
839 for (
int i = 0; i < 629; i++) {
856 print_mem_saved(
"source code forward", bs);
867 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)
BArrayState * BLI_array_store_state_add(BArrayStore *bs, const void *data, size_t data_len, const BArrayState *state_reference)
bool BLI_array_store_is_valid(BArrayStore *bs)
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, uint arr_len, size_t arr_stride, int dir)
#define BLI_assert_unreachable()
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_shuffle_array(struct RNG *rng, void *data, unsigned int elem_size_i, unsigned int elem_num) 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_num, unsigned int seed)
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)
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_mallocN)(size_t len, const char *str)