// This file is part of Eigenx, an extension of Eigen.
//
// Copyright (C) 2018-2019 Allan Leal
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

// Permit the use of the `all` placeholder without Eigen::all
using Eigen::all;

// Exported Eigenx functions
using Eigen::zeros;
using Eigen::ones;
using Eigen::constants;
using Eigen::random;
using Eigen::linspace;
using Eigen::unit;
using Eigen::unitrow;
using Eigen::identity;
using Eigen::tr;
using Eigen::inv;
using Eigen::diag;
using Eigen::diagonal;
using Eigen::norm;
using Eigen::norminf;
using Eigen::sum;
using Eigen::dot;
using Eigen::min;
using Eigen::max;
using Eigen::abs;
using Eigen::sqrt;
using Eigen::pow;
using Eigen::exp;
using Eigen::log;
using Eigen::log10;
using Eigen::rows;
using Eigen::cols;
using Eigen::segment;
using Eigen::block;
using Eigen::submatrix;
using Eigen::blockmap;
using Eigen::rowsmap;
using Eigen::colsmap;

// Exported Eigenx typedefs

using Matrix = Eigen::MatrixXd;
using MatrixXi = Eigen::MatrixXi;
using MatrixXl = Eigen::MatrixXl;
using MatrixXf = Eigen::MatrixXf;
using MatrixXd = Eigen::MatrixXd;
using MatrixXcf = Eigen::MatrixXcf;
using MatrixXcd = Eigen::MatrixXcd;

using MatrixRef = Eigen::MatrixXdRef;
using MatrixXiRef = Eigen::MatrixXiRef;
using MatrixXlRef = Eigen::MatrixXlRef;
using MatrixXfRef = Eigen::MatrixXfRef;
using MatrixXdRef = Eigen::MatrixXdRef;
using MatrixXcfRef = Eigen::MatrixXcfRef;
using MatrixXcdRef = Eigen::MatrixXcdRef;

using MatrixView = Eigen::MatrixXdView;
using MatrixXiView = Eigen::MatrixXiView;
using MatrixXlView = Eigen::MatrixXlView;
using MatrixXfView = Eigen::MatrixXfView;
using MatrixXdView = Eigen::MatrixXdView;
using MatrixXcfView = Eigen::MatrixXcfView;
using MatrixXcdView = Eigen::MatrixXcdView;

using Vector = Eigen::VectorXd;
using VectorXi = Eigen::VectorXi;
using VectorXl = Eigen::VectorXl;
using VectorXf = Eigen::VectorXf;
using VectorXd = Eigen::VectorXd;
using VectorXcf = Eigen::VectorXcf;
using VectorXcd = Eigen::VectorXcd;

using VectorRef = Eigen::VectorXdRef;
using VectorXiRef = Eigen::VectorXiRef;
using VectorXlRef = Eigen::VectorXlRef;
using VectorXfRef = Eigen::VectorXfRef;
using VectorXdRef = Eigen::VectorXdRef;
using VectorXcfRef = Eigen::VectorXcfRef;
using VectorXcdRef = Eigen::VectorXcdRef;

using VectorView = Eigen::VectorXdView;
using VectorXiView = Eigen::VectorXiView;
using VectorXlView = Eigen::VectorXlView;
using VectorXfView = Eigen::VectorXfView;
using VectorXdView = Eigen::VectorXdView;
using VectorXcfView = Eigen::VectorXcfView;
using VectorXcdView = Eigen::VectorXcdView;

using RowVector = Eigen::RowVectorXd;
using RowVectorXi = Eigen::RowVectorXi;
using RowVectorXl = Eigen::RowVectorXl;
using RowVectorXf = Eigen::RowVectorXf;
using RowVectorXd = Eigen::RowVectorXd;
using RowVectorXcf = Eigen::RowVectorXcf;
using RowVectorXcd = Eigen::RowVectorXcd;

using RowVectorRef = Eigen::RowVectorXdRef;
using RowVectorXiRef = Eigen::RowVectorXiRef;
using RowVectorXlRef = Eigen::RowVectorXlRef;
using RowVectorXfRef = Eigen::RowVectorXfRef;
using RowVectorXdRef = Eigen::RowVectorXdRef;
using RowVectorXcfRef = Eigen::RowVectorXcfRef;
using RowVectorXcdRef = Eigen::RowVectorXcdRef;

using RowVectorView = Eigen::RowVectorXdView;
using RowVectorXiView = Eigen::RowVectorXiView;
using RowVectorXlView = Eigen::RowVectorXlView;
using RowVectorXfView = Eigen::RowVectorXfView;
using RowVectorXdView = Eigen::RowVectorXdView;
using RowVectorXcfView = Eigen::RowVectorXcfView;
using RowVectorXcdView = Eigen::RowVectorXcdView;

using StridedVectorRef = Eigen::StridedVectorXdRef;
using StridedVectorXiRef = Eigen::StridedVectorXiRef;
using StridedVectorXlRef = Eigen::StridedVectorXlRef;
using StridedVectorXfRef = Eigen::StridedVectorXfRef;
using StridedVectorXdRef = Eigen::StridedVectorXdRef;
using StridedVectorXcfRef = Eigen::StridedVectorXcfRef;
using StridedVectorXcdRef = Eigen::StridedVectorXcdRef;

using StridedVectorView = Eigen::StridedVectorXdView;
using StridedVectorXiView = Eigen::StridedVectorXiView;
using StridedVectorXlView = Eigen::StridedVectorXlView;
using StridedVectorXfView = Eigen::StridedVectorXfView;
using StridedVectorXdView = Eigen::StridedVectorXdView;
using StridedVectorXcfView = Eigen::StridedVectorXcfView;
using StridedVectorXcdView = Eigen::StridedVectorXcdView;

using PermutationMatrix = Eigen::PermutationMatrix<-1, -1, int>;

using FixedMatrix = Eigen::FixedMatrixXd;
using FixedMatrixXi = Eigen::FixedMatrixXi;
using FixedMatrixXl = Eigen::FixedMatrixXl;
using FixedMatrixXf = Eigen::FixedMatrixXf;
using FixedMatrixXd = Eigen::FixedMatrixXd;
using FixedMatrixXcf = Eigen::FixedMatrixXcf;
using FixedMatrixXcd = Eigen::FixedMatrixXcd;

using FixedVector = Eigen::FixedVectorXd;
using FixedVectorXi = Eigen::FixedVectorXi;
using FixedVectorXl = Eigen::FixedVectorXl;
using FixedVectorXf = Eigen::FixedVectorXf;
using FixedVectorXd = Eigen::FixedVectorXd;
using FixedVectorXcf = Eigen::FixedVectorXcf;
using FixedVectorXcd = Eigen::FixedVectorXcd;

using FixedRowVector = Eigen::FixedRowVectorXd;
using FixedRowVectorXi = Eigen::FixedRowVectorXi;
using FixedRowVectorXl = Eigen::FixedRowVectorXl;
using FixedRowVectorXf = Eigen::FixedRowVectorXf;
using FixedRowVectorXd = Eigen::FixedRowVectorXd;
using FixedRowVectorXcf = Eigen::FixedRowVectorXcf;
using FixedRowVectorXcd = Eigen::FixedRowVectorXcd;
