aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/basetypes/MCHashMap.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/basetypes/MCHashMap.cc')
-rw-r--r--src/core/basetypes/MCHashMap.cc41
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);
+ }
+}