diff options
Diffstat (limited to 'src/core/basetypes/MCHashMap.cc')
-rw-r--r-- | src/core/basetypes/MCHashMap.cc | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/src/core/basetypes/MCHashMap.cc b/src/core/basetypes/MCHashMap.cc index 164198f5..551392a6 100644 --- a/src/core/basetypes/MCHashMap.cc +++ b/src/core/basetypes/MCHashMap.cc @@ -7,6 +7,8 @@ #include "MCString.h" #include "MCUtils.h" #include "MCLog.h" +#include "MCIterator.h" +#include "MCAssert.h" using namespace mailcore; @@ -274,3 +276,42 @@ void HashMap::removeAllObjects() memset(mCells, 0, mAllocated * sizeof(* mCells)); mCount = 0; } + +HashMap * HashMap::serializable() +{ + HashMap * result = Object::serializable(); + Array * keys = Array::array(); + Array * values = Array::array(); + mc_foreachhashmapKeyAndValue(Object, key, Object, value, this) { + if (MCISKINDOFCLASS(key, String)) { + keys->addObject(key); + } + else { + keys->addObject(key->serializable()); + } + values->addObject(value->serializable()); + } + result->setObjectForKey(MCSTR("keys"), keys); + result->setObjectForKey(MCSTR("values"), values); + return result; +} + +void HashMap::importSerializable(HashMap * serializable) +{ + Array * keys = (Array *) serializable->objectForKey(MCSTR("keys")); + Array * values = (Array *) serializable->objectForKey(MCSTR("values")); + unsigned int count = keys->count(); + MCAssert(count == values->count()); + for(unsigned int i = 0 ; i < count ; i ++) { + Object * serializedKey = keys->objectAtIndex(i); + Object * key; + if (MCISKINDOFCLASS(serializedKey, String)) { + key = serializedKey; + } + else { + key = Object::objectWithSerializable((HashMap *) serializedKey); + } + Object * value = Object::objectWithSerializable((HashMap *) keys->objectAtIndex(i)); + setObjectForKey(key, value); + } +} |