Exemple #1
0
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());
}
Exemple #2
0
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());
}
Exemple #3
0
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));
}
Exemple #4
0
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));
}
Exemple #5
0
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));
}
Exemple #6
0
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));
}
Exemple #7
0
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);
    }
}