17dd252788645e940eada959bdde927426e2531c9Paul Duffin/*
27dd252788645e940eada959bdde927426e2531c9Paul Duffin * Copyright (C) 2012 The Guava Authors
37dd252788645e940eada959bdde927426e2531c9Paul Duffin *
47dd252788645e940eada959bdde927426e2531c9Paul Duffin * Licensed under the Apache License, Version 2.0 (the "License");
57dd252788645e940eada959bdde927426e2531c9Paul Duffin * you may not use this file except in compliance with the License.
67dd252788645e940eada959bdde927426e2531c9Paul Duffin * You may obtain a copy of the License at
77dd252788645e940eada959bdde927426e2531c9Paul Duffin *
87dd252788645e940eada959bdde927426e2531c9Paul Duffin * http://www.apache.org/licenses/LICENSE-2.0
97dd252788645e940eada959bdde927426e2531c9Paul Duffin *
107dd252788645e940eada959bdde927426e2531c9Paul Duffin * Unless required by applicable law or agreed to in writing, software
117dd252788645e940eada959bdde927426e2531c9Paul Duffin * distributed under the License is distributed on an "AS IS" BASIS,
127dd252788645e940eada959bdde927426e2531c9Paul Duffin * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137dd252788645e940eada959bdde927426e2531c9Paul Duffin * See the License for the specific language governing permissions and
147dd252788645e940eada959bdde927426e2531c9Paul Duffin * limitations under the License.
157dd252788645e940eada959bdde927426e2531c9Paul Duffin */
167dd252788645e940eada959bdde927426e2531c9Paul Duffin
177dd252788645e940eada959bdde927426e2531c9Paul Duffinpackage com.google.common.cache;
187dd252788645e940eada959bdde927426e2531c9Paul Duffin
197dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.annotations.GwtCompatible;
207dd252788645e940eada959bdde927426e2531c9Paul Duffinimport com.google.common.base.Supplier;
217dd252788645e940eada959bdde927426e2531c9Paul Duffin
227dd252788645e940eada959bdde927426e2531c9Paul Duffinimport java.util.concurrent.atomic.AtomicLong;
237dd252788645e940eada959bdde927426e2531c9Paul Duffin
247dd252788645e940eada959bdde927426e2531c9Paul Duffin/**
257dd252788645e940eada959bdde927426e2531c9Paul Duffin * Source of {@link LongAddable} objects that deals with GWT, Unsafe, and all
267dd252788645e940eada959bdde927426e2531c9Paul Duffin * that.
270888a09821a98ac0680fad765217302858e70fa4Paul Duffin *
287dd252788645e940eada959bdde927426e2531c9Paul Duffin * @author Louis Wasserman
297dd252788645e940eada959bdde927426e2531c9Paul Duffin */
307dd252788645e940eada959bdde927426e2531c9Paul Duffin@GwtCompatible(emulated = true)
317dd252788645e940eada959bdde927426e2531c9Paul Duffinfinal class LongAddables {
327dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final Supplier<LongAddable> SUPPLIER;
330888a09821a98ac0680fad765217302858e70fa4Paul Duffin
347dd252788645e940eada959bdde927426e2531c9Paul Duffin  static {
357dd252788645e940eada959bdde927426e2531c9Paul Duffin    Supplier<LongAddable> supplier;
367dd252788645e940eada959bdde927426e2531c9Paul Duffin    try {
377dd252788645e940eada959bdde927426e2531c9Paul Duffin      new LongAdder();
387dd252788645e940eada959bdde927426e2531c9Paul Duffin      supplier = new Supplier<LongAddable>() {
390888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override
407dd252788645e940eada959bdde927426e2531c9Paul Duffin        public LongAddable get() {
417dd252788645e940eada959bdde927426e2531c9Paul Duffin          return new LongAdder();
427dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
437dd252788645e940eada959bdde927426e2531c9Paul Duffin      };
447dd252788645e940eada959bdde927426e2531c9Paul Duffin    } catch (Throwable t) { // we really want to catch *everything*
457dd252788645e940eada959bdde927426e2531c9Paul Duffin      supplier = new Supplier<LongAddable>() {
460888a09821a98ac0680fad765217302858e70fa4Paul Duffin        @Override
477dd252788645e940eada959bdde927426e2531c9Paul Duffin        public LongAddable get() {
487dd252788645e940eada959bdde927426e2531c9Paul Duffin          return new PureJavaLongAddable();
497dd252788645e940eada959bdde927426e2531c9Paul Duffin        }
507dd252788645e940eada959bdde927426e2531c9Paul Duffin      };
517dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
527dd252788645e940eada959bdde927426e2531c9Paul Duffin    SUPPLIER = supplier;
537dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
540888a09821a98ac0680fad765217302858e70fa4Paul Duffin
557dd252788645e940eada959bdde927426e2531c9Paul Duffin  public static LongAddable create() {
567dd252788645e940eada959bdde927426e2531c9Paul Duffin    return SUPPLIER.get();
577dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
580888a09821a98ac0680fad765217302858e70fa4Paul Duffin
597dd252788645e940eada959bdde927426e2531c9Paul Duffin  private static final class PureJavaLongAddable extends AtomicLong implements LongAddable {
600888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
617dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void increment() {
627dd252788645e940eada959bdde927426e2531c9Paul Duffin      getAndIncrement();
637dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
647dd252788645e940eada959bdde927426e2531c9Paul Duffin
650888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
667dd252788645e940eada959bdde927426e2531c9Paul Duffin    public void add(long x) {
677dd252788645e940eada959bdde927426e2531c9Paul Duffin      getAndAdd(x);
687dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
697dd252788645e940eada959bdde927426e2531c9Paul Duffin
700888a09821a98ac0680fad765217302858e70fa4Paul Duffin    @Override
717dd252788645e940eada959bdde927426e2531c9Paul Duffin    public long sum() {
727dd252788645e940eada959bdde927426e2531c9Paul Duffin      return get();
737dd252788645e940eada959bdde927426e2531c9Paul Duffin    }
747dd252788645e940eada959bdde927426e2531c9Paul Duffin  }
757dd252788645e940eada959bdde927426e2531c9Paul Duffin}
76