tests: distinct structs for read-only or read/write stream buffers

This commit is contained in:
Hugues Delorme 2015-11-23 16:35:26 +01:00
parent de5bc9c6f4
commit 0e526a6ec7
3 changed files with 67 additions and 54 deletions

View File

@ -19,13 +19,13 @@
static gmio_bool_t gmio_stream_buffer_at_end(void* cookie) static gmio_bool_t gmio_stream_buffer_at_end(void* cookie)
{ {
const gmio_stream_buffer_t* buff = (const gmio_stream_buffer_t*)cookie; const gmio_ro_buffer_t* buff = (const gmio_ro_buffer_t*)cookie;
return buff->pos >= buff->len; return buff->pos >= buff->len;
} }
static int gmio_stream_buffer_error(void* cookie) static int gmio_stream_buffer_error(void* cookie)
{ {
const gmio_stream_buffer_t* buff = (const gmio_stream_buffer_t*)cookie; const gmio_ro_buffer_t* buff = (const gmio_ro_buffer_t*)cookie;
return buff == NULL || buff->pos > buff->len; return buff == NULL || buff->pos > buff->len;
} }
@ -33,15 +33,14 @@ static size_t gmio_stream_buffer_read(
void* cookie, void* ptr, size_t item_size, size_t item_count) void* cookie, void* ptr, size_t item_size, size_t item_count)
{ {
if (item_size > 0 && item_count > 0) { if (item_size > 0 && item_count > 0) {
gmio_stream_buffer_t* buff = (gmio_stream_buffer_t*)cookie; gmio_ro_buffer_t* buff = (gmio_ro_buffer_t*)cookie;
const void* buff_ptr = const void* buff_ptr = buff->ptr;
buff->readonly_ptr != NULL ?
buff->readonly_ptr : buff->readwrite_ptr;
const size_t buff_remaining_size = buff->len - buff->pos; const size_t buff_remaining_size = buff->len - buff->pos;
const size_t wanted_read_size = item_size * item_count; const size_t wanted_read_size = item_size * item_count;
const size_t next_read_size = const size_t next_read_size =
wanted_read_size <= buff_remaining_size ? wanted_read_size <= buff_remaining_size ?
wanted_read_size : buff_remaining_size; wanted_read_size :
buff_remaining_size;
const size_t next_read_item_count = next_read_size / item_size; const size_t next_read_item_count = next_read_size / item_size;
memcpy(ptr, memcpy(ptr,
@ -59,15 +58,16 @@ static size_t gmio_stream_buffer_write(
void* cookie, const void* ptr, size_t item_size, size_t item_count) void* cookie, const void* ptr, size_t item_size, size_t item_count)
{ {
if (item_size > 0 && item_count > 0) { if (item_size > 0 && item_count > 0) {
gmio_stream_buffer_t* buff = (gmio_stream_buffer_t*)cookie; gmio_rw_buffer_t* buff = (gmio_rw_buffer_t*)cookie;
const size_t buff_remaining_size = buff->len - buff->pos; const size_t buff_remaining_size = buff->len - buff->pos;
const size_t wanted_write_size = item_size * item_count; const size_t wanted_write_size = item_size * item_count;
const size_t next_write_size = const size_t next_write_size =
wanted_write_size <= buff_remaining_size ? wanted_write_size <= buff_remaining_size ?
wanted_write_size : buff_remaining_size; wanted_write_size :
buff_remaining_size;
const size_t next_write_item_count = next_write_size / item_size; const size_t next_write_item_count = next_write_size / item_size;
memcpy((char*)buff->readwrite_ptr + buff->pos, memcpy((char*)buff->ptr + buff->pos,
ptr, ptr,
next_write_item_count * item_size); next_write_item_count * item_size);
buff->pos += next_write_item_count * item_size; buff->pos += next_write_item_count * item_size;
@ -80,32 +80,40 @@ static size_t gmio_stream_buffer_write(
static gmio_streamsize_t gmio_stream_buffer_size(void* cookie) static gmio_streamsize_t gmio_stream_buffer_size(void* cookie)
{ {
const gmio_stream_buffer_t* buff = (const gmio_stream_buffer_t*)cookie; const gmio_ro_buffer_t* buff = (const gmio_ro_buffer_t*)cookie;
return buff->len; return buff->len;
} }
static int gmio_stream_buffer_get_pos(void* cookie, gmio_stream_pos_t* pos) static int gmio_stream_buffer_get_pos(void* cookie, gmio_stream_pos_t* pos)
{ {
gmio_stream_buffer_t* buff = (gmio_stream_buffer_t*)cookie; gmio_ro_buffer_t* buff = (gmio_ro_buffer_t*)cookie;
memcpy(&pos->cookie[0], &buff->pos, sizeof(size_t)); memcpy(&pos->cookie[0], &buff->pos, sizeof(size_t));
return 0; return 0;
} }
static int gmio_stream_buffer_set_pos(void* cookie, const gmio_stream_pos_t* pos) static int gmio_stream_buffer_set_pos(void* cookie, const gmio_stream_pos_t* pos)
{ {
gmio_stream_buffer_t* buff = (gmio_stream_buffer_t*)cookie; gmio_ro_buffer_t* buff = (gmio_ro_buffer_t*)cookie;
memcpy(&buff->pos, &pos->cookie[0], sizeof(size_t)); memcpy(&buff->pos, &pos->cookie[0], sizeof(size_t));
return 0; return 0;
} }
void gmio_stream_set_buffer(gmio_stream_t *stream, gmio_stream_buffer_t* buff) gmio_stream_t gmio_istream_buffer(gmio_ro_buffer_t* buff)
{ {
stream->cookie = buff; gmio_stream_t stream = {0};
stream->func_at_end = gmio_stream_buffer_at_end; stream.cookie = buff;
stream->func_error = gmio_stream_buffer_error; stream.func_at_end = gmio_stream_buffer_at_end;
stream->func_read = gmio_stream_buffer_read; stream.func_error = gmio_stream_buffer_error;
stream->func_write = gmio_stream_buffer_write; stream.func_read = gmio_stream_buffer_read;
stream->func_size = gmio_stream_buffer_size; stream.func_size = gmio_stream_buffer_size;
stream->func_get_pos = gmio_stream_buffer_get_pos; stream.func_get_pos = gmio_stream_buffer_get_pos;
stream->func_set_pos = gmio_stream_buffer_set_pos; stream.func_set_pos = gmio_stream_buffer_set_pos;
return stream;
}
gmio_stream_t gmio_stream_buffer(gmio_rw_buffer_t* buff)
{
gmio_stream_t stream = gmio_istream_buffer((gmio_ro_buffer_t*)buff);
stream.func_write = gmio_stream_buffer_write;
return stream;
} }

View File

@ -18,15 +18,25 @@
#include "../src/gmio_core/stream.h" #include "../src/gmio_core/stream.h"
struct gmio_stream_buffer /* Read-only buffer */
struct gmio_ro_buffer
{ {
const void* readonly_ptr; const void* ptr;
void* readwrite_ptr;
size_t len; size_t len;
size_t pos; size_t pos;
}; };
typedef struct gmio_stream_buffer gmio_stream_buffer_t; typedef struct gmio_ro_buffer gmio_ro_buffer_t;
void gmio_stream_set_buffer(gmio_stream_t* stream, gmio_stream_buffer_t* buff); /* Read/write buffer */
struct gmio_rw_buffer
{
void* ptr;
size_t len;
size_t pos;
};
typedef struct gmio_rw_buffer gmio_rw_buffer_t;
gmio_stream_t gmio_istream_buffer(gmio_ro_buffer_t* buff);
gmio_stream_t gmio_iostream_buffer(gmio_rw_buffer_t* buff);
#endif /* GMIO_STREAM_BUFFER_H */ #endif /* GMIO_STREAM_BUFFER_H */

View File

@ -124,22 +124,21 @@ const char* test_internal__fast_atof()
return NULL; return NULL;
} }
static const char test_internal__gmio_fast_atof__fstr[] = "1234.567E05";
const char* test_internal__gmio_fast_atof() const char* test_internal__gmio_fast_atof()
{ {
const char fstr[] = "1234.567E05"; const float f1 = fast_atof(test_internal__gmio_fast_atof__fstr);
const float f1 = fast_atof(fstr);
{ {
char strbuff[2048] = {0}; char strbuff[2048] = {0};
gmio_stringstream_t it = {0}; gmio_stringstream_t it = {0};
gmio_stream_buffer_t streambuff = {0}; gmio_ro_buffer_t streambuff = {
gmio_stream_t stream = {0}; &test_internal__gmio_fast_atof__fstr[0],
sizeof(test_internal__gmio_fast_atof__fstr) - 1,
0 };
gmio_stream_t stream = gmio_istream_buffer(&streambuff);
float f2; float f2;
streambuff.readonly_ptr = &fstr[0];
streambuff.len = sizeof(fstr) - 1;
gmio_stream_set_buffer(&stream, &streambuff);
it.stream = &stream; it.stream = &stream;
it.strbuff.ptr = &strbuff[0]; it.strbuff.ptr = &strbuff[0];
it.strbuff.max_len = sizeof(strbuff) - 1; it.strbuff.max_len = sizeof(strbuff) - 1;
@ -176,16 +175,19 @@ const char* test_internal__safe_cast()
return NULL; return NULL;
} }
const char* test_internal__stringstream() static const char test_internal__stringstream__text[] =
{
const char text[] =
"Une citation,\to je crois qu'elle est de moi :" "Une citation,\to je crois qu'elle est de moi :"
"Parfois le chemin est rude.\n" "Parfois le chemin est rude.\n"
"pi : 3.1415926535897932384626433832795"; "pi : 3.1415926535897932384626433832795";
const char* test_internal__stringstream()
{ {
gmio_stream_buffer_t buff = {0}; {
gmio_stream_t stream = {0}; gmio_ro_buffer_t buff = {
&test_internal__stringstream__text[0],
sizeof(test_internal__stringstream__text) - 1,
0 };
gmio_stream_t stream = gmio_istream_buffer(&buff);
char small_fwd_it_str[4]; char small_fwd_it_str[4];
char fwd_it_str[32]; char fwd_it_str[32];
@ -194,11 +196,6 @@ const char* test_internal__stringstream()
char copy_str[128]; char copy_str[128];
gmio_string_t copy_strbuff; gmio_string_t copy_strbuff;
buff.readonly_ptr = text;
buff.len = strlen(text);
buff.pos = 0;
gmio_stream_set_buffer(&stream, &buff);
fwd_it.stream = &stream; fwd_it.stream = &stream;
fwd_it.strbuff.ptr = fwd_it_str; fwd_it.strbuff.ptr = fwd_it_str;
fwd_it.strbuff.max_len = sizeof(fwd_it_str); fwd_it.strbuff.max_len = sizeof(fwd_it_str);
@ -246,8 +243,11 @@ const char* test_internal__stringstream()
} }
{ {
gmio_stream_buffer_t buff = {0}; gmio_ro_buffer_t buff = {
gmio_stream_t stream = {0}; &test_internal__stringstream__text[0],
sizeof(test_internal__stringstream__text) - 1,
0 };
gmio_stream_t stream = gmio_istream_buffer(&buff);
char fwd_it_str[32]; char fwd_it_str[32];
gmio_stringstream_t fwd_it = {0}; gmio_stringstream_t fwd_it = {0};
@ -255,11 +255,6 @@ const char* test_internal__stringstream()
char copy_str[128]; char copy_str[128];
gmio_string_t copy_strbuff; gmio_string_t copy_strbuff;
buff.readonly_ptr = text;
buff.len = strlen(text);
buff.pos = 0;
gmio_stream_set_buffer(&stream, &buff);
fwd_it.stream = &stream; fwd_it.stream = &stream;
fwd_it.strbuff.ptr = fwd_it_str; fwd_it.strbuff.ptr = fwd_it_str;
fwd_it.strbuff.max_len = sizeof(fwd_it_str); fwd_it.strbuff.max_len = sizeof(fwd_it_str);