package org.lwjgl.util.shaderc;

import javax.annotation.Nullable;
import org.lwjgl.system.Callback;

public abstract class ShadercIncludeResolve extends Callback implements ShadercIncludeResolveI {
   public static ShadercIncludeResolve create(long functionPointer) {
      ShadercIncludeResolveI instance = (ShadercIncludeResolveI)Callback.get(functionPointer);
      return (ShadercIncludeResolve)(instance instanceof ShadercIncludeResolve ? (ShadercIncludeResolve)instance : new Container(functionPointer, instance));
   }

   @Nullable
   public static ShadercIncludeResolve createSafe(long functionPointer) {
      return functionPointer == 0L ? null : create(functionPointer);
   }

   public static ShadercIncludeResolve create(ShadercIncludeResolveI instance) {
      return (ShadercIncludeResolve)(instance instanceof ShadercIncludeResolve ? (ShadercIncludeResolve)instance : new Container(instance.address(), instance));
   }

   protected ShadercIncludeResolve() {
      super(CIF);
   }

   ShadercIncludeResolve(long functionPointer) {
      super(functionPointer);
   }

   private static final class Container extends ShadercIncludeResolve {
      private final ShadercIncludeResolveI delegate;

      Container(long functionPointer, ShadercIncludeResolveI delegate) {
         super(functionPointer);
         this.delegate = delegate;
      }

      public long invoke(long user_data, long requested_source, int type, long requesting_source, long include_depth) {
         return this.delegate.invoke(user_data, requested_source, type, requesting_source, include_depth);
      }
   }
}
