diff --git a/include/ustring.h b/include/ustring.h index bb82464..5367925 100644 --- a/include/ustring.h +++ b/include/ustring.h @@ -30,9 +30,7 @@ struct _ustring { // -------------------- private -------------------- arraylist_t _alist; - bool is_view; - bool _sorted; struct _iterator _iter; @@ -40,9 +38,9 @@ struct _ustring // -------------------- public -------------------- // char operations - bool (*set)(struct _ustring *self, size_t index, const char c); // O(1) - bool (*get)(struct _ustring *self, size_t index, char *c); // O(1) - char (*at)(struct _ustring *self, size_t index); // O(1) + bool (*set)(struct _ustring *self, size_t index, const char c); // O(1) + bool (*get)(struct _ustring *self, size_t index, char *c); // O(1) + const char* (*at)(struct _ustring *self, size_t index); // O(1) // base bool (*reserve)(struct _ustring *self, size_t capacity); @@ -108,13 +106,13 @@ struct _ustring bool (*format)(struct _ustring *self, const char *format); // compare - int (*eq)(struct _ustring *self, struct _ustring *other); - int (*ne)(struct _ustring *self, struct _ustring *other); - int (*lt)(struct _ustring *self, struct _ustring *other); - int (*le)(struct _ustring *self, struct _ustring *other); - int (*gt)(struct _ustring *self, struct _ustring *other); - int (*ge)(struct _ustring *self, struct _ustring *other); - int (*cmp)(struct _ustring *self, struct _ustring *other); + int (*eq)(struct _ustring *self, uview_t v); + int (*ne)(struct _ustring *self, uview_t v); + int (*lt)(struct _ustring *self, uview_t v); + int (*le)(struct _ustring *self, uview_t v); + int (*gt)(struct _ustring *self, uview_t v); + int (*ge)(struct _ustring *self, uview_t v); + int (*cmp)(struct _ustring *self, uview_t v); // iter iterator_t (*iter)(struct _ustring *self, linear_order_t order); diff --git a/src/darray.c b/src/darray.c index 6e757f3..ce34979 100644 --- a/src/darray.c +++ b/src/darray.c @@ -421,6 +421,7 @@ static bool darray_init(struct _darray *self, size_t obj_size, size_t capacity) self->search = darry_search; // -------------------- default -------------------- + self->compare = compare_char; self->print_obj = default_print_obj; // -------------------- debug -------------------- diff --git a/src/ustring.c b/src/ustring.c index 4c33d6f..42d2d54 100644 --- a/src/ustring.c +++ b/src/ustring.c @@ -143,11 +143,11 @@ static bool ustring_get(struct _ustring *self, size_t index, char *c) return self->_alist->get(self->_alist, index, &c); } -static char ustring_at(struct _ustring *self, size_t index) +static const char* ustring_at(struct _ustring *self, size_t index) { unicstl_assert(self != NULL); unicstl_assert(self->_alist != NULL); - return *(char *)self->_alist->at(self->_alist, index); + return self->_alist->at(self->_alist, index); } bool ustring_iter_hasnext(struct _iterator *iter) @@ -473,6 +473,60 @@ static bool ustring_strip_right(struct _ustring *self) return true; } +int ustring_cmp(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + // size_t min = self->len(self) < v.len ? self->len(self) : v.len; + // for (size_t i = 0; i < min; i++) + // { + // const char *a = (const char *)self->at(self, i); + // if (*a != v.str[i]) + // { + // return *(char*)self->at(self, i) - v.str[i]; + // } + // } + log_debug("self[%d]:%s, v.str[%d]:%s", self->len(self), self->at(self, 0), v.len, v.str); + + size_t max = self->len(self) > v.len ? self->len(self) : v.len; + return strncmp(self->at(self, 0), v.str, max); +} + +int ustring_eq(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) == 0; +} + +int ustring_ne(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) != 0; +} + +int ustring_lt(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) < 0; +} + +int ustring_le(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) <= 0; +} + +int ustring_gt(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) > 0; +} + +int ustring_ge(struct _ustring *self, uview_t v) +{ + unicstl_assert(self != NULL); + return self->cmp(self, v) >= 0; +} + static bool ustring_init(struct _ustring *self, uview_t view, bool is_view) { unicstl_assert(self != NULL); @@ -534,6 +588,14 @@ static bool ustring_init(struct _ustring *self, uview_t view, bool is_view) self->strip_left = ustring_strip_left; self->strip_right = ustring_strip_right; + self->eq = ustring_eq; + self->ne = ustring_ne; + self->lt = ustring_lt; + self->le = ustring_le; + self->gt = ustring_gt; + self->ge = ustring_ge; + self->cmp = ustring_cmp; + // -------------------- default -------------------- self->print_obj = uprint_char; diff --git a/test/test_ustring.c b/test/test_ustring.c index 3ae70d7..9b461a9 100644 --- a/test/test_ustring.c +++ b/test/test_ustring.c @@ -183,6 +183,24 @@ void test_ustring_append(void) ustring_free(&str2); } +void test_ustring_cmp(void) +{ + ustring_t str = ustring_new_fromcstr("unicstl"); + TEST_ASSERT_TRUE(str->eq(str, uv("unicstl"))); + TEST_ASSERT_TRUE(str->ne(str, uv("unicstl1"))); + + TEST_ASSERT_FALSE(str->eq(str, uv(""))); + TEST_ASSERT_TRUE(str->ne(str, uv(""))); + + TEST_ASSERT_FALSE(str->eq(str, uv("unicstz"))); + TEST_ASSERT_FALSE(str->ne(str, uv("unicstl"))); + + TEST_ASSERT_TRUE(str->le(str, uv("unicstz"))); + TEST_ASSERT_TRUE(str->ge(str, uv("unicsta"))); + TEST_ASSERT_TRUE(str->lt(str, uv("unicstz"))); + TEST_ASSERT_TRUE(str->gt(str, uv("unicsta"))); + ustring_free(&str); +} void test_ustring(void) { @@ -210,4 +228,6 @@ void test_ustring(void) RUN_TEST(test_ustring_strip); RUN_TEST(test_ustring_append); + + RUN_TEST(test_ustring_cmp); }