Skip to content

Commit 979a75d

Browse files
committed
All testcases passed.
1 parent 41eff02 commit 979a75d

File tree

5 files changed

+220
-213
lines changed

5 files changed

+220
-213
lines changed

src/cstl_basic_string_iterator.c

Lines changed: 36 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,21 +77,44 @@ bool_t _basic_string_iterator_equal(basic_string_iterator_t it_first, basic_stri
7777
*/
7878
void _basic_string_iterator_get_value(basic_string_iterator_t it_iter, void* pv_value)
7979
{
80-
bool_t b_result = false;
80+
bool_t b_result = false;
81+
basic_string_t* pt_basic_string = NULL;
82+
_byte_t* pby_terminator = NULL;
83+
size_t t_typesize = 0;
8184

8285
assert(pv_value != NULL);
8386
assert(_basic_string_iterator_belong_to_basic_string(_BASIC_STRING_ITERATOR_CONTAINER(it_iter), it_iter));
8487
assert(!_basic_string_iterator_equal(it_iter, basic_string_end(_BASIC_STRING_ITERATOR_CONTAINER(it_iter))));
8588

89+
pt_basic_string = _BASIC_STRING_ITERATOR_CONTAINER(it_iter);
90+
t_typesize = _GET_BASIC_STRING_TYPE_SIZE(pt_basic_string);
91+
pby_terminator = pt_basic_string->_pby_string + basic_string_size(pt_basic_string) * t_typesize;
92+
8693
/* char* */
87-
if (strncmp(_GET_BASIC_STRING_TYPE_BASENAME(_BASIC_STRING_ITERATOR_CONTAINER(it_iter)),
88-
_C_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {
89-
*(char**)pv_value = (char*)string_c_str((string_t*)_BASIC_STRING_ITERATOR_COREPOS(it_iter));
90-
} else {
91-
b_result = _GET_BASIC_STRING_TYPE_SIZE(_BASIC_STRING_ITERATOR_CONTAINER(it_iter));
92-
_GET_BASIC_STRING_TYPE_COPY_FUNCTION(_BASIC_STRING_ITERATOR_CONTAINER(it_iter))(
94+
if (strncmp(_GET_BASIC_STRING_TYPE_BASENAME(pt_basic_string), _C_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {
95+
if (memcmp(pby_terminator, _BASIC_STRING_ITERATOR_COREPOS(it_iter), t_typesize) != 0) {
96+
*(char**)pv_value = (char*)string_c_str((string_t*)_BASIC_STRING_ITERATOR_COREPOS(it_iter));
97+
} else {
98+
*(char**)pv_value = NULL;
99+
}
100+
} else if (_GET_BASIC_STRING_TYPE_STYLE(pt_basic_string) == _TYPE_C_BUILTIN) {
101+
b_result = _GET_BASIC_STRING_TYPE_SIZE(pt_basic_string);
102+
_GET_BASIC_STRING_TYPE_COPY_FUNCTION(pt_basic_string)(
93103
pv_value, _BASIC_STRING_ITERATOR_COREPOS(it_iter), &b_result);
94104
assert(b_result);
105+
} else {
106+
if (memcmp(pby_terminator, _BASIC_STRING_ITERATOR_COREPOS(it_iter), t_typesize) != 0) {
107+
b_result = _GET_BASIC_STRING_TYPE_SIZE(pt_basic_string);
108+
_GET_BASIC_STRING_TYPE_COPY_FUNCTION(pt_basic_string)(
109+
pv_value, _BASIC_STRING_ITERATOR_COREPOS(it_iter), &b_result);
110+
assert(b_result);
111+
} else {
112+
b_result = _GET_BASIC_STRING_TYPE_SIZE(pt_basic_string);
113+
_GET_BASIC_STRING_TYPE_DESTROY_FUNCTION(pt_basic_string)(pv_value, &b_result);
114+
assert(b_result);
115+
116+
memcpy(pv_value, pby_terminator, t_typesize);
117+
}
95118
}
96119
}
97120

@@ -100,21 +123,16 @@ void _basic_string_iterator_get_value(basic_string_iterator_t it_iter, void* pv_
100123
*/
101124
void _basic_string_iterator_set_value(basic_string_iterator_t it_iter, const void* cpv_value)
102125
{
103-
bool_t b_result = false;
104-
105-
assert(cpv_value != NULL);
106126
assert(_basic_string_iterator_belong_to_basic_string(_BASIC_STRING_ITERATOR_CONTAINER(it_iter), it_iter));
107127
assert(!_basic_string_iterator_equal(it_iter, basic_string_end(_BASIC_STRING_ITERATOR_CONTAINER(it_iter))));
108128

109-
/* char* */
110-
if (strncmp(_GET_BASIC_STRING_TYPE_BASENAME(_BASIC_STRING_ITERATOR_CONTAINER(it_iter)),
111-
_C_STRING_TYPE, _TYPE_NAME_SIZE) == 0) {
112-
string_assign_cstr((string_t*)_BASIC_STRING_ITERATOR_COREPOS(it_iter), (char*)cpv_value);
129+
if (_iterator_get_typestyle(it_iter) == _TYPE_C_BUILTIN &&
130+
strncmp(_iterator_get_typebasename(it_iter), _C_STRING_TYPE, _TYPE_NAME_SIZE) != 0) {
131+
_basic_string_copy_subcstr_auxiliary(
132+
_BASIC_STRING_ITERATOR_CONTAINER(it_iter), _BASIC_STRING_ITERATOR_COREPOS(it_iter), cpv_value, 1);
113133
} else {
114-
b_result = _GET_BASIC_STRING_TYPE_SIZE(_BASIC_STRING_ITERATOR_CONTAINER(it_iter));
115-
_GET_BASIC_STRING_TYPE_COPY_FUNCTION(_BASIC_STRING_ITERATOR_CONTAINER(it_iter))(
116-
_BASIC_STRING_ITERATOR_COREPOS(it_iter), cpv_value, &b_result);
117-
assert(b_result);
134+
_basic_string_copy_subcstr_auxiliary(
135+
_BASIC_STRING_ITERATOR_CONTAINER(it_iter), _BASIC_STRING_ITERATOR_COREPOS(it_iter), &cpv_value, 1);
118136
}
119137
}
120138

0 commit comments

Comments
 (0)