// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.naming.overloadaggressively;

import java.util.Random;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;

public class FieldUpdater {
  @SuppressWarnings("unchecked")
  public static void main(String[] args) {
    A a = new A();
    B b = new B();
    AtomicReferenceFieldUpdater f3Updater =
        AtomicReferenceFieldUpdater.newUpdater(A.class, B.class, "f3");
    f3Updater.set(a, b);
    AtomicReferenceFieldUpdater f2Updater =
        AtomicReferenceFieldUpdater.newUpdater(A.class, Object.class, "f2");
    f2Updater.set(a, b);
    assert a.f2 instanceof B;
    assert a.f2 == a.f3;
    ((B) a.f2).f2 = a;
    assert b.f2 instanceof A;
    assert ((A) b.f2).f2 == b;

    Random random = new Random();
    int next = random.nextInt();
    AtomicIntegerFieldUpdater f1Updater =
        AtomicIntegerFieldUpdater.newUpdater(A.class, "f1");
    f1Updater.set(a, next);
    B viaF3 = a.f3;
    viaF3.f1 = next;
    int diff = viaF3.f1 - a.f1;
    System.out.println("diff: " + diff);
  }
}
