/* ----------------------------------------------------------------------------
 * This file was automatically generated by SWIG (http://www.swig.org).
 * Version 2.0.8
 *
 * Do not make changes to this file unless you know what you are doing--modify
 * the SWIG interface file instead.
 * ----------------------------------------------------------------------------- */

package com.savoirfairelinux.sflphone.service;

public class VectMap {
  private long swigCPtr;
  protected boolean swigCMemOwn;

  protected VectMap(long cPtr, boolean cMemoryOwn) {
    swigCMemOwn = cMemoryOwn;
    swigCPtr = cPtr;
  }

  protected static long getCPtr(VectMap obj) {
    return (obj == null) ? 0 : obj.swigCPtr;
  }

  protected void finalize() {
    delete();
  }

  public synchronized void delete() {
    if (swigCPtr != 0) {
      if (swigCMemOwn) {
        swigCMemOwn = false;
        SFLPhoneserviceJNI.delete_VectMap(swigCPtr);
      }
      swigCPtr = 0;
    }
  }

  public VectMap() {
    this(SFLPhoneserviceJNI.new_VectMap__SWIG_0(), true);
  }

  public VectMap(long n) {
    this(SFLPhoneserviceJNI.new_VectMap__SWIG_1(n), true);
  }

  public long size() {
    return SFLPhoneserviceJNI.VectMap_size(swigCPtr, this);
  }

  public long capacity() {
    return SFLPhoneserviceJNI.VectMap_capacity(swigCPtr, this);
  }

  public void reserve(long n) {
    SFLPhoneserviceJNI.VectMap_reserve(swigCPtr, this, n);
  }

  public boolean isEmpty() {
    return SFLPhoneserviceJNI.VectMap_isEmpty(swigCPtr, this);
  }

  public void clear() {
    SFLPhoneserviceJNI.VectMap_clear(swigCPtr, this);
  }

  public void add(StringMap x) {
    SFLPhoneserviceJNI.VectMap_add(swigCPtr, this, StringMap.getCPtr(x), x);
  }

  public StringMap get(int i) {
    return new StringMap(SFLPhoneserviceJNI.VectMap_get(swigCPtr, this, i), false);
  }

  public void set(int i, StringMap val) {
    SFLPhoneserviceJNI.VectMap_set(swigCPtr, this, i, StringMap.getCPtr(val), val);
  }

}
