//===-- CFCMutableSet.cpp ---------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "CFCMutableSet.h"


// CFCString constructor
CFCMutableSet::CFCMutableSet(CFMutableSetRef s)
    : CFCReleaser<CFMutableSetRef>(s) {}

// CFCMutableSet copy constructor
CFCMutableSet::CFCMutableSet(const CFCMutableSet &rhs)
    : CFCReleaser<CFMutableSetRef>(rhs) {}

// CFCMutableSet copy constructor
const CFCMutableSet &CFCMutableSet::operator=(const CFCMutableSet &rhs) {
  if (this != &rhs)
    *this = rhs;
  return *this;
}

// Destructor
CFCMutableSet::~CFCMutableSet() {}

CFIndex CFCMutableSet::GetCount() const {
  CFMutableSetRef set = get();
  if (set)
    return ::CFSetGetCount(set);
  return 0;
}

CFIndex CFCMutableSet::GetCountOfValue(const void *value) const {
  CFMutableSetRef set = get();
  if (set)
    return ::CFSetGetCountOfValue(set, value);
  return 0;
}

const void *CFCMutableSet::GetValue(const void *value) const {
  CFMutableSetRef set = get();
  if (set)
    return ::CFSetGetValue(set, value);
  return NULL;
}

const void *CFCMutableSet::AddValue(const void *value, bool can_create) {
  CFMutableSetRef set = get();
  if (set == NULL) {
    if (!can_create)
      return NULL;
    set = ::CFSetCreateMutable(kCFAllocatorDefault, 0, &kCFTypeSetCallBacks);
    reset(set);
  }
  if (set != NULL) {
    ::CFSetAddValue(set, value);
    return value;
  }
  return NULL;
}

void CFCMutableSet::RemoveValue(const void *value) {
  CFMutableSetRef set = get();
  if (set)
    ::CFSetRemoveValue(set, value);
}

void CFCMutableSet::RemoveAllValues() {
  CFMutableSetRef set = get();
  if (set)
    ::CFSetRemoveAllValues(set);
}
