예제 #1
0
    AvlNode<E> add(Comparator<? super E> comparator, @Nullable E e, int count, int[] result) {
      /*
       * It speeds things up considerably to unconditionally add count to totalCount here,
       * but that destroys failure atomicity in the case of count overflow. =(
       */
      int cmp = comparator.compare(e, elem);
      if (cmp < 0) {
        AvlNode<E> initLeft = left;
        if (initLeft == null) {
          result[0] = 0;
          return addLeftChild(e, count);
        }
        int initHeight = initLeft.height;

        left = initLeft.add(comparator, e, count, result);
        if (result[0] == 0) {
          distinctElements++;
        }
        this.totalCount += count;
        return (left.height == initHeight) ? this : rebalance();
      } else if (cmp > 0) {
        AvlNode<E> initRight = right;
        if (initRight == null) {
          result[0] = 0;
          return addRightChild(e, count);
        }
        int initHeight = initRight.height;

        right = initRight.add(comparator, e, count, result);
        if (result[0] == 0) {
          distinctElements++;
        }
        this.totalCount += count;
        return (right.height == initHeight) ? this : rebalance();
      }

      // adding count to me!  No rebalance possible.
      result[0] = elemCount;
      long resultCount = (long) elemCount + count;
      checkArgument(resultCount <= Integer.MAX_VALUE);
      this.elemCount += count;
      this.totalCount += count;
      return this;
    }
예제 #2
0
 @CanIgnoreReturnValue
 @Override
 public int add(@Nullable E element, int occurrences) {
   checkNonnegative(occurrences, "occurrences");
   if (occurrences == 0) {
     return count(element);
   }
   checkArgument(range.contains(element));
   AvlNode<E> root = rootReference.get();
   if (root == null) {
     comparator().compare(element, element);
     AvlNode<E> newRoot = new AvlNode<E>(element, occurrences);
     successor(header, newRoot, header);
     rootReference.checkAndSet(root, newRoot);
     return 0;
   }
   int[] result = new int[1]; // used as a mutable int reference to hold result
   AvlNode<E> newRoot = root.add(comparator(), element, occurrences, result);
   rootReference.checkAndSet(root, newRoot);
   return result[0];
 }