/* *****************************************************
   THIS IS AN AUTOMATICALLY GENERATED FILE. DO NOT EDIT.
   *****************************************************

   Generated by:
     scitbx.source_generators.array_family.generate_operator_traits_builtin
 */

#ifndef SCITBX_ARRAY_FAMILY_OPERATOR_TRAITS_BUILTIN_H
#define SCITBX_ARRAY_FAMILY_OPERATOR_TRAITS_BUILTIN_H

#ifndef DOXYGEN_SHOULD_SKIP_THIS

#include <complex>

namespace scitbx { namespace af {

  // The default traits: the result type is the type of the lhs argument.
  template<typename TypeLHS, typename TypeRHS>
  struct binary_operator_traits {
    typedef TypeLHS arithmetic;
  };

  // The remainder of this file defines the traits where the
  // result type is the type of the rhs argument.

  template<>
  struct binary_operator_traits<signed char, short > {
    typedef short arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, int > {
    typedef int arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, long > {
    typedef long arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, long long > {
    typedef long long arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<signed char, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<short, int > {
    typedef int arithmetic;
  };

  template<>
  struct binary_operator_traits<short, long > {
    typedef long arithmetic;
  };

  template<>
  struct binary_operator_traits<short, long long > {
    typedef long long arithmetic;
  };

  template<>
  struct binary_operator_traits<short, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<short, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<short, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<short, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<int, long > {
    typedef long arithmetic;
  };

  template<>
  struct binary_operator_traits<int, long long > {
    typedef long long arithmetic;
  };

  template<>
  struct binary_operator_traits<int, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<int, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<int, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<int, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<long, long long > {
    typedef long long arithmetic;
  };

  template<>
  struct binary_operator_traits<long, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<long, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<long, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<long, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<long long, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<long long, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<long long, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<long long, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<float, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<float, std::complex<float> > {
    typedef std::complex<float> arithmetic;
  };

  template<>
  struct binary_operator_traits<float, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<double, std::complex<float> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<double, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<std::complex<float>, double > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<std::complex<float>, std::complex<double> > {
    typedef std::complex<double> arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned char, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<float, unsigned char > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned char, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<double, unsigned char > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned short, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<float, unsigned short > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned short, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<double, unsigned short > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned int, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<float, unsigned int > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned int, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<double, unsigned int > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned long, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<float, unsigned long > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned long, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<double, unsigned long > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned long long, float > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<float, unsigned long long > {
    typedef float arithmetic;
  };

  template<>
  struct binary_operator_traits<unsigned long long, double > {
    typedef double arithmetic;
  };

  template<>
  struct binary_operator_traits<double, unsigned long long > {
    typedef double arithmetic;
  };

}} // namespace scitbx::af

#endif // DOXYGEN_SHOULD_SKIP_THIS

#endif // SCITBX_ARRAY_FAMILY_OPERATOR_TRAITS_BUILTIN_H
