forked from MailCore/mailcore2
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'upstream/master' into Providers-API
Merge upstream/master
- Loading branch information
Showing
33 changed files
with
1,304 additions
and
506 deletions.
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
// | ||
// MCICUTypes.h | ||
// mailcore2 | ||
// | ||
// Created by DINH Viêt Hoà on 4/18/13. | ||
// Copyright (c) 2013 MailCore. All rights reserved. | ||
// | ||
|
||
#ifndef __MAILCORE_MCICUTYPES_H_ | ||
#define __MAILCORE_MCICUTYPES_H_ | ||
|
||
#if defined(__CHAR16_TYPE__) | ||
typedef __CHAR16_TYPE__ UChar; | ||
#else | ||
typedef uint16_t UChar; | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
// | ||
// MCIterator.h | ||
// mailcore2 | ||
// | ||
// Created by DINH Viêt Hoà on 4/18/13. | ||
// Copyright (c) 2013 MailCore. All rights reserved. | ||
// | ||
|
||
#ifndef __MAILCORE_ITERATOR_H_ | ||
#define __MAILCORE_ITERATOR_H_ | ||
|
||
#include <MailCore/MCArray.h> | ||
#include <MailCore/MCHashMap.h> | ||
#include <MailCore/MCAutoreleasePool.h> | ||
#include <string.h> | ||
|
||
#ifdef __cplusplus | ||
|
||
#define mc_foreacharray(type, __variable, __array) \ | ||
type * __variable; \ | ||
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \ | ||
for (; NULL != (__variable = (type *) mailcore::ArrayIteratorNext(&__variable##__iterator)); ) | ||
|
||
#define mc_foreacharrayIndex(__index, type, __variable, __array) \ | ||
type * __variable; \ | ||
mailcore::ArrayIterator __variable##__iterator = mailcore::ArrayIteratorInit(__array); \ | ||
for (unsigned int __index = 0; NULL != (__variable = mailcore::ArrayIteratorNext(&__variable##__iterator)); __index++) | ||
|
||
#define mc_foreachdictionaryKey(keyType, __key, __dictionary) \ | ||
keyType * __key; \ | ||
DictionaryIterator __key##__iterator = DictionaryIteratorInit(__dictionary, true, false); \ | ||
while (DictionaryIteratorRun(&__key##__iterator)) \ | ||
while (DictionaryIteratorNext(&__key##__iterator, &__key, NULL)) | ||
|
||
#define mc_foreachdictionaryValue(valueType, __value, __dictionary) \ | ||
valueType * __value; \ | ||
DictionaryIterator __value##__iterator = DictionaryIteratorInit(__dictionary, false, true); \ | ||
while (DictionaryIteratorRun(&__value##__iterator)) \ | ||
while (DictionaryIteratorNext(&__value##__iterator, NULL, &__value)) | ||
|
||
#define mc_foreachdictionaryKeyAndValue(__key, __value, __dictionary) \ | ||
keyType * __key; \ | ||
valueType * __value; \ | ||
DictionaryIterator __key##__value##__iterator = DictionaryIteratorInit(__dictionary, true, true); \ | ||
while (DictionaryIteratorRun(&__key##__value##__iterator)) \ | ||
while (DictionaryIteratorNext(&__key##__value##__iterator, &__key, &__value)) | ||
|
||
namespace mailcore { | ||
|
||
struct ArrayIterator { | ||
unsigned index; | ||
unsigned count; | ||
Array * array; | ||
}; | ||
|
||
static inline ArrayIterator ArrayIteratorInit(Array * array) | ||
{ | ||
ArrayIterator iterator = { 0, array->count(), array }; | ||
return iterator; | ||
} | ||
|
||
static inline Object * ArrayIteratorNext(ArrayIterator * iterator) | ||
{ | ||
if (iterator->index >= iterator->count) { | ||
return NULL; | ||
} | ||
|
||
Object * result = iterator->array->objectAtIndex(iterator->index); | ||
++ iterator->index; | ||
return result; | ||
} | ||
|
||
|
||
struct HashMapIterator { | ||
bool cleanup; | ||
unsigned index; | ||
unsigned count; | ||
Array * keys; | ||
Array * values; | ||
}; | ||
|
||
static inline HashMapIterator FastDictionaryIteratorInit(HashMap * hashmap, bool useKeys, bool useValues) | ||
{ | ||
AutoreleasePool * pool = new AutoreleasePool(); | ||
Array * keys = useKeys ? hashmap->allKeys() : NULL; | ||
Array * values = useValues ? hashmap->allValues() : NULL; | ||
keys->retain(); | ||
values->retain(); | ||
HashMapIterator iterator = { false, 0, hashmap->count(), keys, values }; | ||
pool->release(); | ||
|
||
return iterator; | ||
} | ||
|
||
static inline bool HashMapIteratorNext(HashMapIterator * iterator, Object ** keyp, Object ** valuep) | ||
{ | ||
if (iterator->index >= iterator->count) { | ||
return false; | ||
} | ||
|
||
if (keyp != NULL) { | ||
* keyp = iterator->keys->objectAtIndex(iterator->index); | ||
} | ||
if (valuep != NULL) { | ||
* valuep = iterator->values->objectAtIndex(iterator->index); | ||
} | ||
iterator->index ++; | ||
return true; | ||
} | ||
|
||
|
||
static inline bool DictionaryIteratorRun(HashMapIterator * iterator) | ||
{ | ||
if (iterator->cleanup) { | ||
iterator->cleanup = true; | ||
return true; | ||
} else { | ||
iterator->keys->release(); | ||
iterator->values->release(); | ||
return false; | ||
} | ||
} | ||
|
||
}; | ||
|
||
#endif | ||
|
||
#endif |
Oops, something went wrong.