From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Kirill Shcherbatov Subject: [PATCH v1 1/1] Implement mp_stack_top for mp_stack class Date: Tue, 2 Apr 2019 18:49:57 +0300 Message-Id: <316cea905dca2ac8db8b1adb9d0040a9c338dc5c.1554219130.git.kshcherbatov@tarantool.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit To: tarantool-patches@freelists.org, vdavydov.dev@gmail.com Cc: Kirill Shcherbatov List-ID: Introduced a new mp_stack_top method for mp_stack class to return the pointer to a top frame of the stack. This is required in scope of multikey indexes to keep a pointer to a multikey frame and extract currently processed item index of this frame later. Needed for https://github.com/tarantool/tarantool/issues/1257 --- https://github.com/tarantool/msgpuck/tree/kshch/gh-1257-new-mpstacktop-method https://github.com/tarantool/tarantool/issues/1257 msgpuck.h | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/msgpuck.h b/msgpuck.h index eab1339..c91d5d1 100644 --- a/msgpuck.h +++ b/msgpuck.h @@ -1278,6 +1278,14 @@ mp_stack_is_empty(struct mp_stack *stack); MP_PROTO bool mp_stack_is_full(struct mp_stack *stack); +/** + * \brief Return the top mp_stack \a stack frame. + * \param stack - the pointer to a mp_stack to operate with. + * \pre mp_stack_is_empty(stack) == false + */ +MP_PROTO struct mp_frame * +mp_stack_top(struct mp_stack *stack); + /** * \brief Pop the top mp_stack \a stack frame. * \param stack - the pointer to a mp_stack to operate with. @@ -2349,6 +2357,12 @@ mp_stack_is_full(struct mp_stack *stack) return stack->used >= stack->size; } +MP_IMPL struct mp_frame * +mp_stack_top(struct mp_stack *stack) +{ + return &stack->frames[stack->used - 1]; +} + MP_IMPL void mp_stack_pop(struct mp_stack *stack) { @@ -2370,20 +2384,20 @@ MP_IMPL enum mp_type mp_stack_type(struct mp_stack *stack) { assert(!mp_stack_is_empty(stack)); - return stack->frames[stack->used - 1].type; + return mp_stack_top(stack)->type; } MP_IMPL int mp_stack_count(struct mp_stack *stack) { - return stack->frames[stack->used - 1].count; + return mp_stack_top(stack)->count; } MP_IMPL int mp_stack_advance(struct mp_stack *stack) { assert(!mp_stack_is_empty(stack)); - struct mp_frame *frame = &stack->frames[stack->used - 1]; + struct mp_frame *frame = mp_stack_top(stack); if (frame->curr < frame->count - 1) return ++frame->curr; return -1; -- 2.21.0