﻿//
// Copyright © 2019 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include <armnn/Types.hpp>
#include <armnn/Tensor.hpp>

#include <boost/assert.hpp>

namespace armnnUtils
{

/// Provides access to the appropriate indexes for Channels, Height and Width based on DataLayout
class DataLayoutIndexed
{
public:
    DataLayoutIndexed(armnn::DataLayout dataLayout);

    armnn::DataLayout GetDataLayout()    const { return m_DataLayout; }
    unsigned int      GetChannelsIndex() const { return m_ChannelsIndex; }
    unsigned int      GetHeightIndex()   const { return m_HeightIndex; }
    unsigned int      GetWidthIndex()    const { return m_WidthIndex; }

    inline unsigned int GetIndex(const armnn::TensorShape& shape,
                                 unsigned int batchIndex, unsigned int channelIndex,
                                 unsigned int heightIndex, unsigned int widthIndex) const
    {
        BOOST_ASSERT( batchIndex < shape[0] || ( shape[0] == 0 && batchIndex == 0 ) );
        BOOST_ASSERT( channelIndex < shape[m_ChannelsIndex] ||
                    ( shape[m_ChannelsIndex] == 0 && channelIndex == 0) );
        BOOST_ASSERT( heightIndex < shape[m_HeightIndex] ||
                    ( shape[m_HeightIndex] == 0 && heightIndex == 0) );
        BOOST_ASSERT( widthIndex < shape[m_WidthIndex] ||
                    ( shape[m_WidthIndex] == 0 && widthIndex == 0) );

        /// Offset the given indices appropriately depending on the data layout
        switch (m_DataLayout)
        {
        case armnn::DataLayout::NHWC:
            batchIndex  *= shape[1] * shape[2] * shape[3]; // batchIndex *= heightIndex * widthIndex * channelIndex
            heightIndex *= shape[m_WidthIndex] * shape[m_ChannelsIndex];
            widthIndex  *= shape[m_ChannelsIndex];
            /// channelIndex stays unchanged
            break;
        case armnn::DataLayout::NCHW:
        default:
            batchIndex   *= shape[1] * shape[2] * shape[3]; // batchIndex *= heightIndex * widthIndex * channelIndex
            channelIndex *= shape[m_HeightIndex] * shape[m_WidthIndex];
            heightIndex  *= shape[m_WidthIndex];
            /// widthIndex stays unchanged
            break;
        }

        /// Get the value using the correct offset
        return batchIndex + channelIndex + heightIndex + widthIndex;
    }

private:
    armnn::DataLayout m_DataLayout;
    unsigned int      m_ChannelsIndex;
    unsigned int      m_HeightIndex;
    unsigned int      m_WidthIndex;
};

/// Equality methods
bool operator==(const armnn::DataLayout& dataLayout, const DataLayoutIndexed& indexed);
bool operator==(const DataLayoutIndexed& indexed, const armnn::DataLayout& dataLayout);

} // namespace armnnUtils
