From f1f41ef3203dce2ca730ac38778f3d14b8d7136b Mon Sep 17 00:00:00 2001 From: Patrick Pelissier Date: Wed, 25 Mar 2020 11:43:55 +0100 Subject: [PATCH] * Add missing iterator functions * Export iterators in oplist so that it is usable in algorithm --- m-string.h | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/m-string.h b/m-string.h index d36d95b2..d0ecbf08 100644 --- a/m-string.h +++ b/m-string.h @@ -1266,6 +1266,25 @@ string_it(string_it_t it, const string_t str) it->u = 0; } +static inline void +string_it_end(string_it_t it, const string_t str) +{ + STRINGI_CONTRACT(str); + assert(it != NULL); + it->ptr = &string_get_cstr(str)[string_size(str)]; + it->next_ptr = 0; + it->u = 0; +} + +static inline void +string_it_set(string_it_t it, const string_it_t itsrc) +{ + assert(it != NULL && itsrc != NULL); + it->ptr = itsrc->ptr; + it->next_ptr = itsrc->next_ptr; + it->u = itsrc->u; +} + static inline bool string_end_p (string_it_t it) { @@ -1284,6 +1303,15 @@ string_end_p (string_it_t it) return false; } +static inline bool +string_it_equal_p(const string_it_t it1, const string_it_t it2) +{ + assert(it1 != NULL && it2 != NULL); + // IT1.ptr == IT2.ptr ==> IT1 == IT2 ==> All fields are equal + assert(it1->ptr != it2->ptr || (it1->next_ptr == it2->next_ptr && it1->u == it2->u)); + return it1->ptr == it2->ptr; +} + static inline void string_next (string_it_t it) { @@ -1298,6 +1326,13 @@ string_get_cref (const string_it_t it) return it->u; } +static inline const string_unicode_t * +string_cref (const string_it_t it) +{ + assert (it != NULL); + return &it->u; +} + /* Push unicode into string, encoding it in UTF8 */ static inline void string_push_u (string_t str, string_unicode_t u) @@ -1438,6 +1473,15 @@ namespace m_string { OUT_SERIAL(string_out_serial), IN_SERIAL(string_in_serial), \ EXT_ALGO(STRING_SPLIT), \ OOR_EQUAL(string_oor_equal_p), OOR_SET(string_oor_set) \ + ,SUBTYPE(string_unicode_t) \ + ,IT_TYPE(string_it_t) \ + ,IT_FIRST(string_it) \ + ,IT_END(string_it_end) \ + ,IT_SET(string_it_set) \ + ,IT_END_P(string_end_p) \ + ,IT_EQUAL_P(string_it_equal_p) \ + ,IT_NEXT(string_next) \ + ,IT_CREF(string_cref) \ ) /* Register the OPLIST as a global one */