namespace Eigen {

/** \page TopicCustomizing_Functors Writing custom functors

Several Eigen extension points accept a user-provided function object, or functor. This is often the lightest way to
customize an expression without defining a new expression type.

\section CustomFunctors_Where Where functors are used

Common entry points include:

- \link MatrixBase::unaryExpr unaryExpr()\endlink for coefficient-wise unary operations.
- \link MatrixBase::binaryExpr binaryExpr()\endlink for coefficient-wise binary operations.
- \link DenseBase::NullaryExpr NullaryExpr()\endlink for procedural matrices whose coefficients are generated on
  demand. See \ref TopicCustomizing_NullaryExpr for larger examples.
- \link DenseBase::redux redux()\endlink and \link VectorwiseOp::redux colwise()/rowwise().redux()\endlink for custom
  reductions. See \ref TutorialReductionsVisitorsBroadcastingReductionsUserdefined for a tutorial example.

\section CustomFunctors_ScalarInterface Scalar interface

At minimum, a functor provides an \c operator() matching the expression kind:

\code
struct clamp {
  double lo, hi;
  double operator()(double x) const { return x < lo ? lo : (hi < x ? hi : x); }
};

struct add_scaled {
  double scale;
  double operator()(double a, double b) const { return a + scale * b; }
};

struct checkerboard {
  double operator()(Eigen::Index i, Eigen::Index j) const { return ((i + j) % 2) ? -1.0 : 1.0; }
};
\endcode

The result type is deduced from \c operator() and may differ from the input scalar type.
Binary functors can rely on Eigen's scalar binary-op traits when the return type follows the usual scalar rules; custom
mixed-scalar operations may need a ScalarBinaryOpTraits specialization.

Functors used with \c redux() must implement an associative binary operation and return the same scalar type as the
expression, because Eigen may combine coefficients in an order chosen by the evaluator.

\section CustomFunctors_Traits Cost and vectorization traits

Eigen assigns conservative defaults to unknown functors:

\code
template <typename T>
struct functor_traits {
  enum { Cost = 10, PacketAccess = false, IsRepeatable = false };
};
\endcode

For performance-sensitive functors, specialize \c Eigen::internal::functor_traits for your functor:

\code
namespace Eigen {
namespace internal {
template <>
struct functor_traits<clamp> {
  enum { Cost = 3 * NumTraits<double>::AddCost, PacketAccess = false };
};
}  // namespace internal
}  // namespace Eigen
\endcode

\c Cost is an approximate scalar cost used by Eigen's expression evaluators. \c PacketAccess may be set to \c true only
when the functor also provides packet overloads compatible with the packet types used by the relevant scalar type.
Unary and binary packetized functors usually provide a \c packetOp() member; reduction functors that support packet
reductions also provide \c predux().

Most user functors should start with scalar-only code and leave \c PacketAccess set to \c false. That keeps the functor
portable and lets Eigen use the scalar path for that operation while preserving vectorization opportunities elsewhere in
the expression.

\section CustomFunctors_State Capturing state

Functor objects are copied into expression objects and may be evaluated later. Store any captured data so that it
outlives the expression evaluation. For example, a nullary functor producing a view into another matrix should either
store a safe reference to an object owned by the caller or require the caller to evaluate the expression before the
referenced object goes out of scope.

\section CustomFunctors_WhenNot When a functor is not enough

If the expression needs a new shape, a custom nested expression type, or evaluator-specific behavior that cannot be
expressed coefficient by coefficient, see \ref TopicNewExpressionType. For many procedural matrices and indexed views,
\ref TopicCustomizing_NullaryExpr is simpler than a new expression type.

*/

}
