#include <stdio.h>
#include <stdlib.h>
#include "MultiSet.h"

MultiSet* multiset_union(MultiSet *A, MultiSet *B) {
  if (!A || !B)  return NULL;
  size_t newsize = A->size + B->size;
  size_t Abyte = sizeof(int) * A->size;
  size_t Bbyte = sizeof(int) * B->size;
  MultiSet *C = (MultiSet*)malloc(sizeof(size_t) + sizeof(int) * newsize);
  if (!C)  return NULL;
  C->size = newsize;
  memcpy((char*)C + sizeof(size_t), (char*)A + sizeof(size_t), Abyte); 
  memcpy((char*)C + sizeof(size_t) + Abyte, (char*)B + sizeof(size_t), Bbyte);
  return C;
}

MultiSet* multiset_new(size_t size, int *elements) {
  // NULL == 0
  if (!elements)  return NULL;
  MultiSet *ret = (MultiSet*)malloc(sizeof(size_t) + sizeof(int) * size);
  if (!ret)  return NULL;
  ret->size = size;
  memcpy((char*)ret + sizeof(size_t), elements, sizeof(int) * size);
  return ret;
}

void multiset_destroy(MultiSet* this) {
  free(this);
}