/*
   HARK Library
   Copyright (C) 2021 Honda Research Institute Japan Inc.
 */

#if !defined(_HARKLIB_MATRIX_H_INCLUDED_)
#define _HARKLIB_MATRIX_H_INCLUDED_ 1

#include "hark-lib/hark-lib.h"
#include <Eigen/Dense>

namespace hark
{
    template<typename T>
    class Matrix: public Eigen::Matrix<T, Eigen::Dynamic /*rows*/, Eigen::Dynamic /*cols*/, Eigen::RowMajor>
    {
    public:
        using Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>::Matrix;

    public:
        static const bool native_is_row_major() {
            return hark::Matrix<T>::Flags & Eigen::RowMajorBit;
        }
        static Matrix from_col_major_image(T *image, size_t rows, size_t cols)
        {
            return Matrix(Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::ColMajor> >(image, rows, cols));
        }
        static Matrix from_row_major_image(T *image, size_t rows, size_t cols)
        {
            return Matrix(Eigen::Map<Eigen::Matrix<T, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> >(image, rows, cols));
        }
        static Matrix from_native_image(T *image, size_t rows, size_t cols){
            return native_is_row_major() ? from_row_major_image(image, rows, cols) : from_col_major_image(image, rows, cols);
        }
    };
}

#endif /* #if !defined(_HARKLIB_MATRIX_H_INCLUDED_) */

/* end of file */
