You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
88 lines
3.2 KiB
88 lines
3.2 KiB
// |
|
// Copyright (C) 2002, 2003 Si-Lab b.v.b.a., Toon Knapen and Kresimir Fresl |
|
// 2010 Thomas Klimpel |
|
// |
|
// Distributed under the Boost Software License, Version 1.0. |
|
// (See accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
// |
|
|
|
#ifndef BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP |
|
#define BOOST_NUMERIC_BINDINGS_DETAIL_CONFIG_FORTRAN_HPP |
|
|
|
#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE) || defined(BIND_FORTRAN_LOWERCASE) || defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE) || defined(BIND_FORTRAN_UPPERCASE) |
|
// Allow manual override of the defaults, e.g. if you want to use a fortran |
|
// lib compiled with gcc from MSVC |
|
#else |
|
|
|
// We have no chance of determining the conventions for linking C with Fortran |
|
// here, because they only depend on the fortran compiler and it's command line |
|
// switches, but not on the C++ compiler which compiles these lines. |
|
|
|
// We default to lowercase underscore, because this is much more common than |
|
// the other option. (The previous automatic configuration only selected the |
|
// other option in case of "defined(__IBMCPP__) || defined(_MSC_VER)".) |
|
#define BIND_FORTRAN_LOWERCASE_UNDERSCORE |
|
|
|
#endif |
|
|
|
// Next we define macro's to convert our symbols to |
|
// the current convention |
|
#if defined(BIND_FORTRAN_LOWERCASE_UNDERSCORE) |
|
#define FORTRAN_ID( id ) id##_ |
|
#define FORTRAN_ID2( id, ID2 ) id##_ |
|
#elif defined(BIND_FORTRAN_LOWERCASE) |
|
#define FORTRAN_ID( id ) id |
|
#define FORTRAN_ID2( id, ID2 ) id |
|
#elif defined(BIND_FORTRAN_UPPERCASE_UNDERSCORE) |
|
#define FORTRAN_ID2( id, ID2 ) ID2##_ |
|
#elif defined(BIND_FORTRAN_UPPERCASE) |
|
#define FORTRAN_ID2( id, ID2 ) ID2 |
|
#else |
|
#error do not know how to bind to fortran calling convention |
|
#endif |
|
|
|
|
|
#ifdef BIND_FORTRAN_F2C_RETURN_CONVENTIONS |
|
// "g77" or clapack or "gfortran -ff2c" |
|
#define BIND_FORTRAN_RETURN_REAL_DOUBLE |
|
#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG |
|
#elif BIND_FORTRAN_MKL_RETURN_CONVENTIONS |
|
// mkl |
|
#define BIND_FORTRAN_RETURN_COMPLEX_FIRST_ARG |
|
#elif BIND_FORTRAN_OSX_RETURN_CONVENTIONS |
|
// OS X |
|
#define BIND_FORTRAN_RETURN_COMPLEX_LAST_ARG |
|
#else |
|
// "g77 -fno-f2c" or "gfortran" |
|
#endif |
|
|
|
|
|
// "g77" or "gfortran" or mkl_intel_lp64 |
|
//#undef BIND_FORTRAN_INTEGER_8 |
|
// clapack or "gfortran -fdefault-integer-8" or mkl_intel_ilp64 |
|
//#define BIND_FORTRAN_INTEGER_8 |
|
|
|
// Most fortran compilers use fortran_int_t := int by default, so we follow |
|
// this default, even so f2c (=clapack) uses "typedef long int integer;" |
|
#ifndef BIND_FORTRAN_INTEGER_8 |
|
typedef int fortran_int_t; |
|
#else |
|
typedef std::ptrdiff_t fortran_int_t; |
|
#endif |
|
|
|
// Looks like fortran_int_t and fortran_bool_t should be identical, the unsigned is |
|
// required so overloads can distinguish between fortran_bool_t and fortran_int_t. |
|
#ifndef BIND_FORTRAN_INTEGER_8 |
|
typedef unsigned int fortran_bool_t; |
|
#else |
|
typedef std::size_t fortran_bool_t; |
|
#endif |
|
|
|
// This definition of external_fp is identical to the definition of L_fp from |
|
// f2c, and it seems to work more or less. These functions return fortran_bool_t, |
|
// but they don't all take the same type of arguments. A reinterpret_cast will |
|
// probably work for most compilers to extend the allowed function signatures. |
|
typedef fortran_bool_t (*external_fp)(...); |
|
|
|
#endif // BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H
|
|
|