// Copyright 2022 The MediaPipe Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package com.google.mediapipe.tasks.core;

import java.util.concurrent.atomic.AtomicBoolean;

/** Facilitates creation and destruction of the native ModelResourcesCache. */
class ModelResourcesCache {
  private final long nativeHandle;
  private final AtomicBoolean isHandleValid;

  public ModelResourcesCache() {
    nativeHandle = nativeCreateModelResourcesCache();
    isHandleValid = new AtomicBoolean(true);
  }

  public boolean isHandleValid() {
    return isHandleValid.get();
  }

  public long getNativeHandle() {
    if (isHandleValid.get()) {
      return nativeHandle;
    }
    return 0;
  }

  public void release() {
    if (isHandleValid.compareAndSet(true, false)) {
      nativeReleaseModelResourcesCache(nativeHandle);
    }
  }

  private native long nativeCreateModelResourcesCache();

  private native void nativeReleaseModelResourcesCache(long nativeHandle);
}
