summaryrefslogtreecommitdiff
path: root/py
diff options
context:
space:
mode:
authorPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-06 21:20:52 +0300
committerPaul Sokolovsky <pfalcon@users.sourceforge.net>2014-04-06 21:31:42 +0300
commit7cf057aeeb5e8e2beecb7751c4b31c55e72feb40 (patch)
tree3274b019ee0f174f843c2cd62859c78f0e43c085 /py
parent5fedd0c3b708d2874f93897ff5de2d533079c1fc (diff)
objdict: Implement equality operator.
Sure, it's O(n^2).
Diffstat (limited to 'py')
-rw-r--r--py/objdict.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/py/objdict.c b/py/objdict.c
index 3855c36e6..80337198e 100644
--- a/py/objdict.c
+++ b/py/objdict.c
@@ -86,6 +86,28 @@ STATIC mp_obj_t dict_binary_op(int op, mp_obj_t lhs_in, mp_obj_t rhs_in) {
mp_map_elem_t *elem = mp_map_lookup(&o->map, rhs_in, MP_MAP_LOOKUP);
return MP_BOOL(elem != NULL);
}
+ case MP_BINARY_OP_EQUAL: {
+ // TODO: Support equality to other object types
+ if (MP_OBJ_IS_TYPE(rhs_in, &mp_type_dict)) {
+ mp_obj_dict_t *rhs = rhs_in;
+ if (o->map.used != rhs->map.used) {
+ return mp_const_false;
+ }
+
+ machine_uint_t size = o->map.alloc;
+ mp_map_t *map = &o->map;
+
+ for (machine_uint_t i = 0; i < size; i++) {
+ if (MP_MAP_SLOT_IS_FILLED(map, i)) {
+ mp_map_elem_t *elem = mp_map_lookup(&rhs->map, map->table[i].key, MP_MAP_LOOKUP);
+ if (elem == NULL || !mp_obj_equal(map->table[i].value, elem->value)) {
+ return mp_const_false;
+ }
+ }
+ }
+ return mp_const_true;
+ }
+ }
default:
// op not supported
return NULL;