﻿//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#include "NeonWorkloadUtils.hpp"
#include <backends/aclCommon/ArmComputeTensorUtils.hpp>
#include <backends/aclCommon/ArmComputeUtils.hpp>
#include <backends/neon/NeonTensorHandle.hpp>
#include <backends/neon/NeonLayerSupport.hpp>
#include <backends/CpuTensorHandle.hpp>

#include <armnn/Utils.hpp>
#include <armnn/Exceptions.hpp>

#include <cstring>
#include <boost/assert.hpp>
#include <boost/cast.hpp>
#include <boost/format.hpp>

#include "Profiling.hpp"

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

using namespace armnn::armcomputetensorutils;

namespace armnn
{

// Allocates a tensor and copy the contents in data to the tensor contents.
template<typename T>
void InitialiseArmComputeTensorData(arm_compute::Tensor& tensor, const T* data)
{
    InitialiseArmComputeTensorEmpty(tensor);
    CopyArmComputeITensorData(data, tensor);
}

template void InitialiseArmComputeTensorData(arm_compute::Tensor& tensor, const Half* data);
template void InitialiseArmComputeTensorData(arm_compute::Tensor& tensor, const float* data);
template void InitialiseArmComputeTensorData(arm_compute::Tensor& tensor, const uint8_t* data);
template void InitialiseArmComputeTensorData(arm_compute::Tensor& tensor, const int32_t* data);

void InitializeArmComputeTensorDataForFloatTypes(arm_compute::Tensor& tensor,
                                                 const ConstCpuTensorHandle* handle)
{
    BOOST_ASSERT(handle);
    switch(handle->GetTensorInfo().GetDataType())
    {
        case DataType::Float16:
            InitialiseArmComputeTensorData(tensor, handle->GetConstTensor<Half>());
            break;
        case DataType::Float32:
            InitialiseArmComputeTensorData(tensor, handle->GetConstTensor<float>());
            break;
        default:
            BOOST_ASSERT_MSG(false, "Unexpected floating point type.");
    }
};

} //namespace armnn
