/*
 * Copyright (c) 2023 Arm Limited.
 *
 * SPDX-License-Identifier: MIT
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to
 * deal in the Software without restriction, including without limitation the
 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
 * sell copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */

#ifndef CKW_INCLUDE_CKW_TYPES_TENSORSAMPLERTYPES_H
#define CKW_INCLUDE_CKW_TYPES_TENSORSAMPLERTYPES_H

#include <cstdint>

namespace ckw
{

// This enum class defines how the dimensions of a 3d tensor is mapped into x,y and z coordianates.
enum class TensorSamplerFormat : int32_t
{
    Unknown          = 0,
    Dim0_Dim1xDim2_1 = 1, // Original dimensions 1 and 2 are collapsed onto y-axis
    Dim0_Dim1_Dim2   = 2  // Original dimensions stays as they're defined. No collapsing.
};

/** Tensor sampler address mode enum class for X dimension
 *
 *  The following address modes are available in total:
 *      Unknown
 *      None                 : The user guarantees that the coordinate is always in-bound
 *      OverlappingMin       : (FIXED shapes only) Reduce the load/store length when x == 0 (MIN). The load length will be width % original length
 *                             Leftover elements can be handled using overlapping. This involves processing some of the elements in the array twice.
 *      ClampToBorderMaxOnly : Clamp to max value allowed in the corresponding dimension, and construct an if/else guard to prevent out of bound access,
 *                             e.g. if( y < size-of-dimension-y ){ <do the operation>  }
 *      SkipLessThanZero     : Skip loading/storing if the index is less than 0
 *
 *  Individual dimensions choose which adddress mode to implement in their respective enum classes.
 */
enum class TensorSamplerAddressModeX : int32_t
{
    Unknown        = 0,
    None           = 1,
    OverlappingMin = 2
};

/**
 * Similar to @ref TensorSamplerAddressModeX
 */
enum class TensorSamplerAddressModeY : int32_t
{
    Unknown              = 0,
    None                 = 1,
    OverlappingMin       = 2,
    ClampToBorderMaxOnly = 3,
    SkipLessThanZero     = 4
};

/**
 * Similar to @ref TensorSamplerAddressModeX
 */
enum class TensorSamplerAddressModeZ : int32_t
{
    Unknown = 0,
    None    = 1,
};

} // namespace ckw

#endif // CKW_INCLUDE_CKW_TYPES_TENSORSAMPLERTYPES_H
