TEST_F(BufferTest, alloc_empty) { void * p = mem_buffer_alloc(&m_buffer, 12); EXPECT_TRUE(p); EXPECT_EQ((size_t)12, mem_buffer_size(&m_buffer)); strncpy((char*)p, "abc", 12); EXPECT_STREQ("abc", as_string()); }
int ReadTest::read(const char * data, const char * typeName, int policy, size_t capacity) { LPDRMETA meta = dr_lib_find_meta_by_name(m_metaLib, typeName); EXPECT_TRUE(meta) << "get meta " << typeName << " error!"; if (meta == 0) return -1; if (capacity == 0) { capacity = dr_meta_size(meta); } cfg_t input = t_cfg_parse(data); EXPECT_TRUE(input) << "parse input to cfg fail!"; if (input == 0) return -1; t_elist_clear(); mem_buffer_clear(&m_buffer); return dr_cfg_read( mem_buffer_alloc(&m_buffer, capacity), capacity, input, meta, policy, t_em()); }
TEST_F(BufferTest, alloc_empty_null) { m_buffer.m_default_allocrator = mem_allocrator_null(); EXPECT_FALSE(mem_buffer_alloc(&m_buffer, 12)); EXPECT_EQ((size_t)0, mem_buffer_size(&m_buffer)); }
TEST_F(BufferTest, set_size_small) { mem_buffer_alloc(&m_buffer, 12); EXPECT_EQ(0, mem_buffer_set_size(&m_buffer, 10)); EXPECT_EQ((size_t)10, mem_buffer_size(&m_buffer)); }
TEST_F(BufferTest, set_size_bigger) { mem_buffer_alloc(&m_buffer, 12); EXPECT_EQ(0, mem_buffer_set_size(&m_buffer, 14)); EXPECT_EQ((size_t)14, mem_buffer_size(&m_buffer)); }
TEST_F(BufferTest, set_size_empty) { mem_buffer_alloc(&m_buffer, 12); EXPECT_EQ(0, mem_buffer_set_size(&m_buffer, 12)); EXPECT_EQ((size_t)12, mem_buffer_size(&m_buffer)); }
void * mem_pos_insert_alloc(mem_buffer_pos_t pos, size_t n) { struct mem_buffer_trunk * trunk; assert(pos); assert(pos->m_buffer); if (n <= 0) return NULL; if (pos->m_trunk == NULL) { return mem_buffer_alloc(pos->m_buffer, n); } if (pos->m_pos_in_trunk == 0) { /*pos at begin of trunk, alloc a new trunk to store data*/ trunk = mem_trunk_alloc(pos->m_buffer->m_default_allocrator, n); if (trunk == NULL) { return NULL; } TAILQ_INSERT_BEFORE(pos->m_trunk, trunk, m_next); pos->m_buffer->m_size += n; trunk->m_size = n; return mem_trunk_data(trunk); } else if (pos->m_trunk->m_capacity >= pos->m_pos_in_trunk + n) { /*new data can store in current trunk*/ char * trunkBegin = (char *)mem_trunk_data(pos->m_trunk); char * result = trunkBegin + pos->m_pos_in_trunk; /*can`t store all data in current buffer, move overflow data to a new trunk*/ ssize_t appendSize = pos->m_trunk->m_size + n - pos->m_trunk->m_capacity; if (appendSize > 0) { trunk = mem_trunk_alloc(pos->m_buffer->m_default_allocrator, appendSize); if (trunk == NULL) { return NULL; } TAILQ_INSERT_AFTER(&pos->m_buffer->m_trunks, pos->m_trunk, trunk, m_next); memcpy( mem_trunk_data(trunk), trunkBegin + pos->m_trunk->m_size - appendSize, appendSize); trunk->m_size = appendSize; pos->m_trunk->m_size -= appendSize; } if (pos->m_pos_in_trunk < pos->m_trunk->m_size) { memmove( trunkBegin + pos->m_pos_in_trunk + n, trunkBegin + pos->m_pos_in_trunk, pos->m_trunk->m_size - pos->m_pos_in_trunk); } else { } pos->m_trunk->m_size += pos->m_trunk->m_size - appendSize + n; pos->m_pos_in_trunk += n; if (pos->m_pos_in_trunk >= pos->m_trunk->m_size) { pos->m_pos_in_trunk = pos->m_pos_in_trunk - pos->m_trunk->m_size; pos->m_trunk = trunk; } assert(pos->m_pos_in_trunk < pos->m_trunk->m_size); assert(pos->m_trunk->m_size <= pos->m_trunk->m_capacity); pos->m_buffer->m_size += n; return result; } else { /*new data can not store in current trunk*/ ssize_t moveSize = pos->m_trunk->m_size - pos->m_pos_in_trunk; trunk = mem_trunk_alloc(pos->m_buffer->m_default_allocrator, n + moveSize); if (trunk == NULL) { return NULL; } TAILQ_INSERT_AFTER(&pos->m_buffer->m_trunks, pos->m_trunk, trunk, m_next); assert(moveSize > 0); memcpy( (char *)mem_trunk_data(trunk) + n, (char *)mem_trunk_data(pos->m_trunk) + pos->m_pos_in_trunk, moveSize); trunk->m_size = n + moveSize; pos->m_trunk->m_size = pos->m_pos_in_trunk; pos->m_trunk = trunk; pos->m_pos_in_trunk = n; pos->m_buffer->m_size += n; return mem_trunk_data(trunk); } }