From b4e2a56abcfcd7a1aade965d1912077dc007e91a Mon Sep 17 00:00:00 2001 From: Aoran Zeng Date: Wed, 20 Aug 2025 15:34:05 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=20`xy=5Fseq=5Fat()`?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/xy.h | 53 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 38 insertions(+), 15 deletions(-) diff --git a/lib/xy.h b/lib/xy.h index 0fb9e25..0e30de4 100644 --- a/lib/xy.h +++ b/lib/xy.h @@ -1074,25 +1074,24 @@ xy_parent_dir (const char *path) /****************************************************** * Container ******************************************************/ - -typedef struct XySeq_t -{ - XySeqItem_t *first_item; - xySeqItem_t *last_item; - - uint32_t length; -} -XySeq_t; - typedef struct XySeqItem_t { - XySeqItem_t *prev; - XySeqItem_t *next; + struct XySeqItem_t *prev; + struct XySeqItem_t *next; void *data; } XySeqItem_t; +typedef struct XySeq_t +{ + XySeqItem_t *first_item; + XySeqItem_t *last_item; + + uint32_t length; +} +XySeq_t; + XySeq_t* xy_seq_new (void) @@ -1137,6 +1136,30 @@ xy_seq_last (XySeq_t *seq) return seq->last_item ? seq->last_item->data : NULL; } +/** + * @flavor Ruby: Array#at + * + * @note 序号从1开始 + * + * @return 如果seq中并没有第n个数据,则返回NULL + */ +void * +xy_seq_at (XySeq_t *seq, int n) +{ + xy_cant_be_null (seq); + + if (0 == n) assert (!"The index must begin from 1, not 0"); + + if (1 == n) return seq->first_item ? seq->first_item->data : NULL; + + XySeqItem_t *it = seq->first_item; + for (uint32_t i = 1; i < n && it; i++) + { + it = it->next; + } + return it ? it->data : NULL; +} + /** * @flavor Perl: push @@ -1146,15 +1169,15 @@ xy_seq_push (XySeq_t *seq, void *data) { xy_cant_be_null (seq); - XySeqItem_t *it = xy_malloc0 (sizeof (XySeqItem_t)); - if (!it) return NULL; + XySeqItem_t *it = xy_malloc0 (sizeof (XySeqItem_t));; it->data = data; it->prev = NULL; it->next = NULL; // 更新 item 间关系 - if (XySeqItem_t *l = seq->last_item;) + XySeqItem_t *l = seq->last_item; + if (l) { it->prev = l; l->next = it;