From caf7508207509e058bebf270d8002a7f28c24421 Mon Sep 17 00:00:00 2001 From: "Hoa V. DINH" Date: Sun, 18 May 2014 17:56:34 -0700 Subject: IndexSet iterator --- src/core/basetypes/MCIndexSet.cc | 4 ++-- src/core/basetypes/MCIterator.h | 52 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) (limited to 'src/core') diff --git a/src/core/basetypes/MCIndexSet.cc b/src/core/basetypes/MCIndexSet.cc index 07d78d5d..6c883082 100644 --- a/src/core/basetypes/MCIndexSet.cc +++ b/src/core/basetypes/MCIndexSet.cc @@ -148,7 +148,7 @@ int IndexSet::leftRangeIndexForIndexWithBounds(uint64_t idx, unsigned int left, Range middleRange = mRanges[middle]; if (left == right) { - if (idx <= middleRange.location) { + if (idx <= RangeRightBound(middleRange)) { return left; } else { @@ -156,7 +156,7 @@ int IndexSet::leftRangeIndexForIndexWithBounds(uint64_t idx, unsigned int left, } } - if (idx <= middleRange.location) { + if (idx <= RangeRightBound(middleRange)) { return leftRangeIndexForIndexWithBounds(idx, left, middle); } else { diff --git a/src/core/basetypes/MCIterator.h b/src/core/basetypes/MCIterator.h index 1e51caab..c919c70f 100644 --- a/src/core/basetypes/MCIterator.h +++ b/src/core/basetypes/MCIterator.h @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -46,8 +47,59 @@ HashMapIterator __key##__value##__iterator = HashMapIteratorInit(__hashmap, true while (HashMapIteratorRun(&__key##__value##__iterator)) \ while (HashMapIteratorNext(&__key##__value##__iterator, (Object **) &__key, (Object **) &__value)) +#define mc_foreachindexset(__variable, __indexset) \ +int64_t __variable; \ +mailcore::ArrayIterator __variable##__iterator = mailcore::IndexSetIteratorInit(__array); \ +for (; __variable = IndexSetIteratorValue(&__variable##__iterator), IndexSetIteratorIsValid(&__variable##__iterator) ; mailcore::IndexSetIteratorNext(&__variable##__iterator)) + namespace mailcore { + struct IndexSetIterator { + unsigned int rangeIndex; + unsigned int index; + Range * currentRange; + IndexSet * indexSet; + }; + + static inline IndexSetIterator IndexSetIteratorInit(IndexSet * indexSet) + { + IndexSetIterator iterator = { 0, 0, NULL, indexSet }; + if (indexSet->rangesCount() >= 1) { + iterator.currentRange = &indexSet->allRanges()[0]; + } + return iterator; + } + + static inline bool IndexSetIteratorIsValid(IndexSetIterator * iterator) + { + return iterator->currentRange != NULL; + } + + static inline int64_t IndexSetIteratorValue(IndexSetIterator * iterator) + { + return iterator->currentRange == NULL ? -1 : iterator->currentRange->location + iterator->index; + } + + static inline bool IndexSetIteratorNext(IndexSetIterator * iterator) + { + iterator->index ++; + if (iterator->index >= iterator->currentRange->length) { + // switch to an other range + iterator->index = 0; + iterator->rangeIndex ++; + if (iterator->rangeIndex >= iterator->indexSet->rangesCount()) { + iterator->currentRange = NULL; + return false; + } + else { + return true; + } + } + else { + return true; + } + } + struct ArrayIterator { unsigned index; unsigned count; -- cgit v1.2.3