/** * Adds a key to the multi-set. * * @param me The multi-set to add to. * @param key The key to add. * * @return 0 No error. * -ENOMEM Out of memory. */ int multiset_put(multiset me, void *const key) { if (!me->root) { struct node *insert = multiset_create_node(me, key, NULL); if (!insert) { return -ENOMEM; } me->root = insert; return 0; } struct node *traverse = me->root; while (true) { const int compare = me->comparator(key, traverse->key); if (compare < 0) { if (traverse->left) { traverse = traverse->left; } else { struct node *insert = multiset_create_node(me, key, traverse); if (!insert) { return -ENOMEM; } traverse->left = insert; multiset_insert_balance(me, insert); return 0; } } else if (compare > 0) { if (traverse->right) { traverse = traverse->right; } else { struct node *insert = multiset_create_node(me, key, traverse); if (!insert) { return -ENOMEM; } traverse->right = insert; multiset_insert_balance(me, insert); return 0; } } else { traverse->count++; me->size++; return 0; } } }