All Downloads are FREE. Search and download functionalities are using the official Maven repository.

elemental.util.impl.JreArrayOf Maven / Gradle / Ivy

/*
 * Copyright 2011 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package elemental.util.impl;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import elemental.util.ArrayOf;
import elemental.util.CanCompare;

/**
 * JRE implementation of ArrayOf for server and dev mode.
 */
public class JreArrayOf implements ArrayOf {

  /*
   * TODO(cromwellian): this implemation uses JRE ArrayList. A direct
   * implementation would be more efficient. 
   */
  private ArrayList array;

  public JreArrayOf() {
    array = new ArrayList();
  }

  JreArrayOf(ArrayList array) {
    this.array = array;
  }

  @Override
  public ArrayOf concat(ArrayOf values) {
    assert values instanceof JreArrayOf;
    ArrayList toReturn = new ArrayList(array);
    toReturn.addAll(((JreArrayOf) values).array);
    return new JreArrayOf(toReturn);
  }

  @Override
  public boolean contains(T value) {
    return array.contains(value);
  }

  @Override
  public T get(int index) {
    return index >= length() ? null : array.get(index);
  }

  @Override
  public int indexOf(T value) {
    return array.indexOf(value);
  }

  @Override
  public void insert(int index, T value) {
    if (index >= length()) {
      array.add(value);
    } else {
      if (index < 0) {
        index = index + length();
        if (index < 0) {
          index = 0;
        }
      }
      array.add(index, value);
    }
  }

  @Override
  public boolean isEmpty() {
    return array.isEmpty();
  }

  @Override
  public String join() {
    return join(",");
  }

  @Override
  public String join(String separator) {
    StringBuilder toReturn = new StringBuilder();
    boolean first = true;
    for (T val : array) {
      if (first) {
        first = false;
      } else {
        toReturn.append(separator);
      }
      // JS treats null as "" for purposes of join()
      toReturn.append(val == null ? "" : toStringWithTrim(val));
    }
    return toReturn.toString();
  }

  @Override
  public int length() {
    return array.size();
  }

  @Override
  public T peek() {
    return isEmpty() ? null : array.get(array.size() - 1);
  }

  @Override
  public T pop() {
    return isEmpty() ? null : array.remove(array.size() - 1);
  }

  @Override
  public void push(T value) {
    array.add(value);
  }

  @Override
  public void remove(T value) {
    array.remove(value);
  }

  @Override
  public void removeByIndex(int index) {
    if (index < length()) {
      array.remove(index);
    }
  }

  @Override
  public void set(int index, T value) {
    ensureLength(index);
    array.set(index, value);
  }

  @Override
  public void setLength(int length) {
    if (length > length()) {
      for (int i = length(); i < length; i++) {
        array.add(null);
      }
    } else if (length < length()) {
      for (int i = length(); i > length; i--) {
        array.remove(i - 1);
      }
    }
  }

  @Override
  public T shift() {
    return isEmpty() ? null : array.remove(0);
  }

  @Override
  public void sort(final CanCompare comparator) {
    Collections.sort(array, new Comparator() {
      @Override
      public int compare(T o1, T o2) {
        return comparator.compare(o1, o2);
      }
    });
  }

  @Override
  public ArrayOf splice(int index, int count) {
    ArrayList toReturn = new ArrayList(
        array.subList(index, index + count));
    for (int i = 0; i < count && !isEmpty(); i++) {
      array.remove(index);
    }
    return new JreArrayOf(toReturn);
  }

  @Override
  public void unshift(T value) {
    array.add(0, value);
  }

  private void ensureLength(int index) {
    if (index >= length()) {
      setLength(index + 1);
    }
  }

  static String toStringWithTrim(Object obj) {
    if (obj instanceof Number) {
      String numberStr = obj.toString();
      if (numberStr.endsWith(".0")) {
        numberStr = numberStr.substring(0, numberStr.length() - 2);
      }
      return numberStr;
    }
    return obj.toString();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy