aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core
diff options
context:
space:
mode:
authorGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-05-18 17:56:34 -0700
committerGravatar Hoa V. DINH <dinh.viet.hoa@gmail.com>2014-05-18 17:56:42 -0700
commitcaf7508207509e058bebf270d8002a7f28c24421 (patch)
tree7b20d05592ad34f2c7cd92a70c4a8adb0dfa01eb /src/core
parentf7779360d310dac2ef98a3ae3e7b6e2d14ed850e (diff)
IndexSet iterator
Diffstat (limited to 'src/core')
-rw-r--r--src/core/basetypes/MCIndexSet.cc4
-rw-r--r--src/core/basetypes/MCIterator.h52
2 files changed, 54 insertions, 2 deletions
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 <MailCore/MCArray.h>
#include <MailCore/MCHashMap.h>
+#include <MailCore/MCIndexSet.h>
#include <MailCore/MCAutoreleasePool.h>
#include <string.h>
@@ -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;