/*
 * Copyright (c) 2020-2021 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 ARM_COMPUTE_CLTUNING_PARAMS_H
#define ARM_COMPUTE_CLTUNING_PARAMS_H

#include "arm_compute/core/CL/OpenCL.h"
#include "arm_compute/runtime/CL/CLTunerTypes.h"
#include "support/StringSupport.h"

#include <ostream>

namespace arm_compute
{
/**< OpenCL tuner parameters */
class CLTuningParams
{
public:
    CLTuningParams(const CLTuningParams &) = default;

    CLTuningParams(unsigned int lws_x = 0, unsigned int lws_y = 0, unsigned int lws_z = 0, int wbsm = 0)
        : _lws(lws_x, lws_y, lws_z), _wbsm(wbsm)
    {
    }
    CLTuningParams(cl::NDRange lws, cl_int wbsm = 0)
        : _lws(lws), _wbsm(wbsm)
    {
    }

    CLTuningParams(cl_int wbsm)
        : CLTuningParams(cl::NullRange, wbsm)
    {
    }

    void set_lws(cl::NDRange lws)
    {
        _lws = lws;
    }

    cl::NDRange get_lws() const
    {
        return _lws;
    }

    void set_wbsm(cl_int wbsm)
    {
        _wbsm = wbsm;
    }

    cl_int get_wbsm() const
    {
        return _wbsm;
    }

    std::string to_string(CLTuningInfo tuning_info)
    {
        std::string tuning_params_string = "";
        tuning_params_string += ";" + support::cpp11::to_string(_lws[0]) + ";" + support::cpp11::to_string(_lws[1]) + ";" + support::cpp11::to_string(_lws[2]);
        if(tuning_info.tune_wbsm)
        {
            tuning_params_string += ";" + support::cpp11::to_string(_wbsm);
        }
        return tuning_params_string;
    }

    bool from_string(CLTuningInfo tuning_info, std::string tuning_params_string)
    {
        std::replace(tuning_params_string.begin(), tuning_params_string.end(), ';', ' ');
        std::vector<std::string> array;
        std::stringstream        ss(tuning_params_string);
        std::string              temp;
        while(ss >> temp)
        {
            array.push_back(temp);
        }
        // Read 3 values for lws
        if(array.size() < 3)
        {
            return false;
        }
        const unsigned int lws_0 = support::cpp11::stoi(array[0]);
        const unsigned int lws_1 = support::cpp11::stoi(array[1]);
        const unsigned int lws_2 = support::cpp11::stoi(array[2]);
        if(lws_0 == 0 && lws_1 == 0 && lws_2 == 0)
        {
            // If lws values are 0, cl::NullRange has to be used
            // otherwise the lws object will be badly created
            _lws = cl::NullRange;
        }
        else
        {
            _lws = cl::NDRange(lws_0, lws_1, lws_2);
        }
        array.erase(array.begin(), array.begin() + 3);
        if(tuning_info.tune_wbsm)
        {
            if(array.size() < 1)
            {
                return false;
            }
            _wbsm = support::cpp11::stoi(array[0]);
            array.erase(array.begin());
        }
        return true;
    }

private:
    cl::NDRange _lws;
    cl_int      _wbsm;
};
} // namespace arm_compute
#endif /*ARM_COMPUTE_CLTUNING_PARAMS_H */
