chromium/third_party/eigen3/src/Eigen/src/Core/Inverse.h

// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2014-2019 Gael Guennebaud <[email protected]>
//
// 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/.

#ifndef EIGEN_INVERSE_H
#define EIGEN_INVERSE_H

// IWYU pragma: private
#include "./InternalHeaderCheck.h"

namespace Eigen {

template <typename XprType, typename StorageKind>
class InverseImpl;

namespace internal {

traits<Inverse<XprType>>;

}  // end namespace internal

/** \class Inverse
 *
 * \brief Expression of the inverse of another expression
 *
 * \tparam XprType the type of the expression we are taking the inverse
 *
 * This class represents an abstract expression of A.inverse()
 * and most of the time this is the only way it is used.
 *
 */
template <typename XprType>
class Inverse : public InverseImpl<XprType, typename internal::traits<XprType>::StorageKind> {};

// Generic API dispatcher
template <typename XprType, typename StorageKind>
class InverseImpl : public internal::generic_xpr_base<Inverse<XprType> >::type {};

namespace internal {

/** \internal
 * \brief Default evaluator for Inverse expression.
 *
 * This default evaluator for Inverse expression simply evaluate the inverse into a temporary
 * by a call to internal::call_assignment_no_alias.
 * Therefore, inverse implementers only have to specialize Assignment<Dst,Inverse<...>, ...> for
 * there own nested expression.
 *
 * \sa class Inverse
 */
unary_evaluator<Inverse<ArgType>>;

}  // end namespace internal

}  // end namespace Eigen

#endif  // EIGEN_INVERSE_H