ds: string: implement b_iterable interface

This commit is contained in:
2025-11-01 10:01:59 +00:00
parent 3db808d4c4
commit c94f976751

View File

@@ -48,7 +48,6 @@ struct b_string_iterator_p {
const char **_d;
size_t _nd, _ds;
b_status status;
size_t iteration_index;
size_t byte_index;
size_t codepoint_index;
@@ -1412,7 +1411,7 @@ static b_iterator *iterator_begin(b_object *obj)
struct b_string_p *p = b_object_get_private(obj, B_TYPE_STRING);
if (!p->s_len) {
it->status = B_ERR_NO_DATA;
b_iterator_set_status(it_obj, B_ERR_NO_DATA);
return it_obj;
}
@@ -1422,12 +1421,17 @@ static b_iterator *iterator_begin(b_object *obj)
it->char_value = b_wchar_utf8_codepoint_decode(s);
if (it->char_value == B_WCHAR_INVALID) {
it->status = B_ERR_BAD_FORMAT;
b_iterator_set_status(it_obj, B_ERR_BAD_FORMAT);
}
return it_obj;
}
static const b_iterator *iterator_cbegin(const b_object *obj)
{
return iterator_begin((b_object *)obj);
}
static enum b_status chars_iterator_move_next(struct b_string_iterator_p *it)
{
if (!it->_s_p) {
@@ -1513,6 +1517,21 @@ static b_iterator_value iterator_get_value(b_iterator *obj)
}
}
static const b_iterator_value iterator_get_cvalue(const b_iterator *obj)
{
struct b_string_iterator_p *it
= b_object_get_private(obj, B_TYPE_STRING_ITERATOR);
switch (it->_m) {
case ITERATOR_MODE_CHARS:
return chars_iterator_get_value(it);
case ITERATOR_MODE_TOKENS:
return tokens_iterator_get_value(it);
default:
return B_ITERATOR_VALUE_NULL;
}
}
/*** CLASS DEFINITION *********************************************************/
// ---- b_string DEFINITION
@@ -1520,10 +1539,16 @@ B_TYPE_CLASS_DEFINITION_BEGIN(b_string)
B_TYPE_CLASS_INTERFACE_BEGIN(b_object, B_TYPE_OBJECT)
B_INTERFACE_ENTRY(to_string) = string_to_string;
B_TYPE_CLASS_INTERFACE_END(b_object, B_TYPE_OBJECT)
B_TYPE_CLASS_INTERFACE_BEGIN(b_iterable, B_TYPE_ITERABLE)
B_INTERFACE_ENTRY(it_begin) = iterator_begin;
B_INTERFACE_ENTRY(it_cbegin) = iterator_cbegin;
B_TYPE_CLASS_INTERFACE_END(b_iterable, B_TYPE_ITERABLE)
B_TYPE_CLASS_DEFINITION_END(b_string)
B_TYPE_DEFINITION_BEGIN(b_string)
B_TYPE_ID(0x200194f6, 0x0327, 0x4a82, 0xb9c9, 0xb62ddd038c33);
B_TYPE_IMPLEMENTS(B_TYPE_ITERABLE);
B_TYPE_CLASS(b_string_class);
B_TYPE_INSTANCE_PRIVATE(struct b_string_p);
B_TYPE_INSTANCE_INIT(string_init);
@@ -1540,6 +1565,7 @@ B_TYPE_CLASS_DEFINITION_BEGIN(b_string_iterator)
B_INTERFACE_ENTRY(it_move_next) = iterator_move_next;
B_INTERFACE_ENTRY(it_erase) = NULL;
B_INTERFACE_ENTRY(it_get_value) = iterator_get_value;
B_INTERFACE_ENTRY(it_get_cvalue) = iterator_get_cvalue;
B_TYPE_CLASS_INTERFACE_END(b_iterator, B_TYPE_ITERATOR)
B_TYPE_CLASS_DEFINITION_END(b_string_iterator)