/**
 * Copyright(c) Live2D Inc. All rights reserved.
 *
 * Use of this source code is governed by the Live2D Open Software license
 * that can be found at https://www.live2d.com/eula/live2d-open-software-license-agreement_en.html.
 */

/**
 * メモリアロケーションを抽象化したクラス
 *
 * メモリ確保・解放処理をプラットフォーム側で実装して
 * フレームワークから呼び出すためのインターフェース
 */
export abstract class ICubismAllocator {
  /**
   * アラインメント制約なしのヒープ・メモリーを確保します
   *
   * @param size 確保するバイト数
   * @return 成功すると割り当てられたメモリのアドレス。そうでなければ'0'を返す
   */
  public abstract allocate(size: number): any;

  /**
   * アラインメント制約なしのヒープ・メモリーを解放します。
   *
   * @param memory 解放するメモリのアドレス
   */
  public abstract deallocate(memory: any): void;

  /**
   * アラインメント制約有のヒープ・メモリーを確保します。
   * @param size 確保するバイト数
   * @param alignment メモリーブロックのアラインメント幅
   * @return 成功すると割り当てられたメモリのアドレス。そうでなければ'0'を返す
   */
  public abstract allocateAligned(size: number, alignment: number): any;

  /**
   * アラインメント制約ありのヒープ・メモリーを解放します。
   * @param alignedMemory 解放するメモリのアドレス
   */
  public abstract deallocateAligned(alignedMemory: any): void;
}

// Namespace definition for compatibility.
import * as $ from './icubismallcator';
// eslint-disable-next-line @typescript-eslint/no-namespace
export namespace Live2DCubismFramework {
  export const ICubismAllocator = $.ICubismAllocator;
  export type ICubismAllocator = $.ICubismAllocator;
}
