--------------------------------------------------- lines 9-142 of file: include/cppad/base_require.hpp --------------------------------------------------- {xrst_begin base_require} {xrst_spell ostream } AD Requirements for a CppAD Base Type ########################################### Syntax ****** | ``# include `` Purpose ******* This section lists the requirements for the type *Base* so that the type ``AD`` < *Base* > can be used. API Warning *********** Defining a CppAD *Base* type is an advanced use of CppAD. This part of the CppAD API changes with time. The most common change is adding more requirements. Search for ``base_require`` in the current :ref:`whats_new-name` section for these changes. Standard Base Types ******************* In the case where *Base* is ``float`` , ``double`` , ``std::complex`` , ``std::complex`` , or ``AD`` < *Other* > , these requirements are provided by including the file ``cppad/cppad.hpp`` . In the documentation, The notation :math:`\B{R}` denotes the field corresponding to the base type. Multiplication must be commutative for this field, but it need not be the reals; e.g., the complex numbers. Include Order ************* If you are linking a non-standard base type to CppAD, you must first include the file ``cppad/base_require.hpp`` , then provide the specifications below, and then include the file ``cppad/cppad.hpp`` . Numeric Type ************ The type *Base* must support all the operations for a :ref:`NumericType-name` . Output Operator *************** The type *Base* must support the syntax *os* << *x* where *os* is an ``std::ostream&`` and *x* is a ``const base_alloc&`` . For example, see :ref:`base_alloc` . Integer ******* The type *Base* must support the syntax *i* = ``CppAD::Integer`` ( *x* ) which converts *x* to an ``int`` . The argument *x* has prototype ``const`` *Base* & *x* and the return value *i* has prototype ``int`` *i* Suggestion ========== In many cases, the *Base* version of the ``Integer`` function can be defined by | ``namespace CppAD`` { | |tab| ``inline int Integer`` ( ``const`` *Base* & ``x`` ) | |tab| { ``return static_cast`` ( ``x`` ); } | } For example, see :ref:`base_float` and :ref:`base_alloc` . Absolute Zero, azmul ******************** The type *Base* must support the syntax *z* = ``azmul`` ( *x* , *y* ) see; :ref:`azmul-name` . The following preprocessor macro invocation suffices (for most *Base* types): | ``namespace CppAD`` { | |tab| ``CPPAD_AZMUL`` ( *Base* ) | } where the macro is defined by {xrst_spell_off} {xrst_code cpp} */ # define CPPAD_AZMUL(Base) \ inline Base azmul(const Base& x, const Base& y) \ { Base zero(0.0); \ if( x == zero ) \ return zero; \ return x * y; \ } /* {xrst_code} {xrst_spell_on} Contents ******** {xrst_toc_table xrst/base_require/base_member.xrst include/cppad/core/base_cond_exp.hpp xrst/base_require/base_identical.xrst xrst/base_require/base_ordered.xrst include/cppad/core/base_std_math.hpp include/cppad/core/base_limits.hpp include/cppad/core/base_to_string.hpp include/cppad/core/base_hash.hpp xrst/base_require/base_example.xrst } {xrst_end base_require}