    // Copyright (C) 2010  Davis E. King (davis@dlib.net)
    // License: Boost Software License   See LICENSE.txt for the full license.
    #ifndef DLIB_BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H
    #define DLIB_BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H

    // ----------------------------------------------------------------------------------------
    // ----------------------------------------------------------------------------------------
    //       FORTRAN BINDING STUFF FROM BOOST
    // ----------------------------------------------------------------------------------------
    // ----------------------------------------------------------------------------------------

    //  Permission to copy, use, modify, sell and
    //  distribute this software is granted provided this copyright notice appears
    //  in all copies. This software is provided "as is" without express or implied
    //  warranty, and with no claim as to its suitability for any purpose.
    //  Copyright (C) 2002, 2003 Si-Lab b.v.b.a., Toon Knapen and Kresimir Fresl

    // First we need to know what the conventions for linking
    // C with Fortran is on this platform/toolset
    #if defined(LAPACK_FORCE_UNDERSCORE)
    #define DLIB_BIND_FORTRAN_LOWERCASE_UNDERSCORE
    #elif defined(LAPACK_FORCE_NOUNDERSCORE)
    #define DLIB_BIND_FORTRAN_LOWERCASE
    #elif defined(__GNUC__) || defined(__ICC) || defined(__sgi) || defined(__COMO__) || defined(__KCC)
    #define DLIB_BIND_FORTRAN_LOWERCASE_UNDERSCORE
    #elif defined(__IBMCPP__) || defined(_MSC_VER) || defined(__BORLANDC__)
    #define DLIB_BIND_FORTRAN_LOWERCASE
    #else
    #error do not know how to link with fortran for the given platform
    #endif

    // Next we define macros to convert our symbols to
    // the current convention
    #if defined(DLIB_BIND_FORTRAN_LOWERCASE_UNDERSCORE)
    #define DLIB_FORTRAN_ID( id ) id##_
    #elif defined(DLIB_BIND_FORTRAN_LOWERCASE)
    #define DLIB_FORTRAN_ID( id ) id
    #else
    #error do not know how to bind to fortran calling convention
    #endif

    namespace dlib
    {
        namespace lapack
        {
                // stuff from f2c used to define what exactly is an integer in fortran
    #if (defined(__alpha__) || defined(__sparc64__) || defined(__x86_64__) || defined(__ia64__) || defined(__aarch64__) || defined(__powerpc64__) || defined(__mips64) || (defined(__riscv) && __riscv_xlen == 64)) && !defined(MATLAB_MEX_FILE) && !defined(USE_64BIT_LAPACK_INTEGERS)
                typedef int integer;
                typedef unsigned int uinteger;
    #else
                typedef long int integer;
                typedef unsigned long int uinteger;
    #endif

        }
    }

    #endif // DLIB_BOOST_NUMERIC_BINDINGS_TRAITS_FORTRAN_H