// Copyright (c) 2022, 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.ir.desugar.varhandle;

import java.lang.reflect.Field;

// Template class for desugaring VarHandle into com.android.tools.r8.DesugarVarHandle.
public final class DesugarVarHandle {

  // This only have methods found in libcore/libart/src/main/java/sun/misc/Unsafe.java for Lollipop.
  private static class UnsafeStub {

    public long objectFieldOffset(Field f) {
      throw new RuntimeException("Stub called.");
    }
  }

  private final UnsafeStub U;
  private final Class<?> recv;
  private final Class<?> type;
  private final long offset;

  DesugarVarHandle(Class<?> recv, String name, Class<?> type) throws Exception {
    Field theUnsafe = UnsafeStub.class.getDeclaredField("theUnsafe");
    theUnsafe.setAccessible(true);
    U = (UnsafeStub) theUnsafe.get(null);
    this.recv = recv;
    Field field = recv.getDeclaredField(name);
    this.type = field.getType();
    this.offset = U.objectFieldOffset(recv.getDeclaredField(name));
  }

  // get variants.
  Object get(Object ct1) {
    // TODO(b/247076137): Implement.
    return null;
  }

  int getInt(Object ct1) {
    // TODO(b/247076137): Implement.
    return -1;
  }

  long getLong(Object ct1) {
    // TODO(b/247076137): Implement.
    return -1L;
  }

  // set variants.
  void set(Object ct1, Object newValue) {
    // TODO(b/247076137): Implement.
  }

  void setInt(Object ct1, int newValue) {
    // TODO(b/247076137): Implement.
  }

  void setLong(Object ct1, long newValue) {
    // TODO(b/247076137): Implement.
  }

  boolean compareAndSet(Object ct1, Object expectedValue, Object newValue) {
    // TODO(b/247076137): Implement.
    return false;
  }

  boolean compareAndSetInt(Object ct1, int expectedValue, int newValue) {
    // TODO(b/247076137): Implement.
    return false;
  }

  boolean compareAndSetLong(Object ct1, long expectedValue, long newValue) {
    // TODO(b/247076137): Implement.
    return false;
  }
}
