[PATCH 11/14] AVIS: Modified iterator to align with MAMA C++ Expectations
Frank Quinn <fquinn.ni@...>
MAMA expects iterators to rewind when begin is called, and remain pointing to the first entry after the *first* time that next is called. This change aligns with that requirement. Signed-off-by: Frank Quinn <fquinn.ni@...> --- mama/c_cpp/src/c/payload/avismsg/avismsgimpl.h | 1 + mama/c_cpp/src/c/payload/avismsg/avispayload.c | 26 +++++++++++++++++++++----- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/mama/c_cpp/src/c/payload/avismsg/avismsgimpl.h b/mama/c_cpp/src/c/payload/avismsg/avismsgimpl.h index f83a1cb..b9b5ef2 100644 --- a/mama/c_cpp/src/c/payload/avismsg/avismsgimpl.h +++ b/mama/c_cpp/src/c/payload/avismsg/avismsgimpl.h @@ -55,6 +55,7 @@ typedef struct avisIterator AttributesIter* mMsgIterator; Attributes* mAvisMsg; avisFieldPayload* mAvisField; + uint64_t mIndex; } avisIterator; diff --git a/mama/c_cpp/src/c/payload/avismsg/avispayload.c b/mama/c_cpp/src/c/payload/avismsg/avispayload.c index e935e15..20063f5 100644 --- a/mama/c_cpp/src/c/payload/avismsg/avispayload.c +++ b/mama/c_cpp/src/c/payload/avismsg/avispayload.c @@ -2046,15 +2046,30 @@ avismsgPayloadIter_next (msgPayloadIter iter, msgFieldPayload field, msgPayload msg) { - avisIterator* impl = (avisIterator*) iter; - if (!iter || !msg || !field) return NULL; + avisIterator* impl = (avisIterator*) iter; + msgFieldPayload ret = NULL; - if (!attributes_iter_next(impl->mMsgIterator)) - return NULL; + if (!iter || !msg) return NULL; + /* Only advance iterator if not first run */ + if (impl->mIndex > 0) + { + impl->mIndex++; + if (!attributes_iter_next(impl->mMsgIterator)) + return NULL; + } - return avismsgPayloadIter_get(iter, impl->mAvisField, msg); + ret = avismsgPayloadIter_get(iter, impl->mAvisField, msg); + if (NULL != ret) + { + impl->mIndex++; + } + + return ret; } +/* This isn't really supported on Avis. HasNext on avis is more like "i've + * just moved to next, do I have anything?" + */ mama_bool_t avismsgPayloadIter_hasNext (msgPayloadIter iter, msgPayload msg) @@ -2073,6 +2088,7 @@ avismsgPayloadIter_begin (msgPayloadIter iter, avisIterator* impl = (avisIterator*) iter; if (!impl) return NULL; + impl->mIndex = 0; attributes_iter_init(impl->mMsgIterator, impl->mAvisMsg); return avismsgPayloadIter_get(iter, impl->mAvisField, msg); } -- 2.4.3
|
|