
// Copyright (c) 2020-2021, ARM Limited.
//
//    Licensed under the Apache License, Version 2.0 (the "License");
//    you may not use this file except in compliance with the License.
//    You may obtain a copy of the License at
//
//         http://www.apache.org/licenses/LICENSE-2.0
//
//    Unless required by applicable law or agreed to in writing, software
//    distributed under the License is distributed on an "AS IS" BASIS,
//    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
//    See the License for the specific language governing permissions and
//    limitations under the License.

#ifndef _TOSA_NUMPY_UTILS_H
#define _TOSA_NUMPY_UTILS_H

#include <cassert>
#include <cctype>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>

#include "half.hpp"

class NumpyUtilities
{
public:
    enum NPError
    {
        NO_ERROR = 0,
        FILE_NOT_FOUND,
        FILE_IO_ERROR,
        FILE_TYPE_MISMATCH,
        HEADER_PARSE_ERROR,
        BUFFER_SIZE_MISMATCH,
    };

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, float* databuf);

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, double* databuf);

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, half_float::half* databuf);

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, int32_t* databuf);

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, int64_t* databuf);

    static NPError readFromNpyFile(const char* filename, const uint32_t elems, bool* databuf);

    static NPError writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const bool* databuf);

    static NPError writeToNpyFile(const char* filename, const uint32_t elems, const bool* databuf);

    static NPError
        writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const half_float::half* databuf);

    static NPError writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const int32_t* databuf);

    static NPError writeToNpyFile(const char* filename, const uint32_t elems, const int32_t* databuf);

    static NPError writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const int64_t* databuf);

    static NPError writeToNpyFile(const char* filename, const uint32_t elems, const int64_t* databuf);

    static NPError writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const float* databuf);

    static NPError writeToNpyFile(const char* filename, const uint32_t elems, const float* databuf);

    static NPError writeToNpyFile(const char* filename, const std::vector<int32_t>& shape, const double* databuf);

    static NPError writeToNpyFile(const char* filename, const uint32_t elems, const double* databuf);

private:
    static NPError writeToNpyFileCommon(const char* filename,
                                        const char* dtype_str,
                                        const size_t elementsize,
                                        const std::vector<int32_t>& shape,
                                        const void* databuf,
                                        bool bool_translate);
    static NPError readFromNpyFileCommon(const char* filename,
                                         const char* dtype_str,
                                         const size_t elementsize,
                                         const uint32_t elems,
                                         void* databuf,
                                         bool bool_translate);
    static NPError checkNpyHeader(FILE* infile, const uint32_t elems, const char* dtype_str);
    static NPError writeNpyHeader(FILE* outfile, const std::vector<int32_t>& shape, const char* dtype_str);
};

#endif    // _TOSA_NUMPY_UTILS_H
