123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564 |
- // Copyright 2008-2016 Conrad Sanderson (http://conradsanderson.id.au)
- // Copyright 2008-2016 National ICT Australia (NICTA)
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- // ------------------------------------------------------------------------
- #undef arma_hot
- #undef arma_cold
- #undef arma_aligned
- #undef arma_align_mem
- #undef arma_warn_unused
- #undef arma_deprecated
- #undef arma_malloc
- #undef arma_inline
- #undef arma_noinline
- #undef arma_ignore
- #define arma_hot
- #define arma_cold
- #define arma_aligned
- #define arma_align_mem
- #define arma_warn_unused
- #define arma_deprecated
- #define arma_malloc
- #define arma_inline inline
- #define arma_noinline
- #define arma_ignore(variable) ((void)(variable))
- #undef arma_fortran_sans_prefix_B
- #undef arma_fortran_with_prefix_B
-
- #if defined(ARMA_BLAS_UNDERSCORE)
- #define arma_fortran_sans_prefix_B(function) function##_
-
- #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
- #define arma_fortran_with_prefix_B(function) wrapper2_##function##_
- #else
- #define arma_fortran_with_prefix_B(function) wrapper_##function##_
- #endif
- #else
- #define arma_fortran_sans_prefix_B(function) function
-
- #if defined(ARMA_USE_FORTRAN_HIDDEN_ARGS)
- #define arma_fortran_with_prefix_B(function) wrapper2_##function
- #else
- #define arma_fortran_with_prefix_B(function) wrapper_##function
- #endif
- #endif
- #undef arma_fortran
- #undef arma_wrapper
- #if defined(ARMA_USE_WRAPPER)
- #define arma_fortran(function) arma_fortran_with_prefix_B(function)
- #define arma_wrapper(function) wrapper_##function
- #else
- #define arma_fortran(function) arma_fortran_sans_prefix_B(function)
- #define arma_wrapper(function) function
- #endif
- #undef arma_fortran_sans_prefix
- #undef arma_fortran_with_prefix
- #define arma_fortran_sans_prefix(function) arma_fortran_sans_prefix_B(function)
- #define arma_fortran_with_prefix(function) arma_fortran_with_prefix_B(function)
- #undef ARMA_INCFILE_WRAP
- #define ARMA_INCFILE_WRAP(x) <x>
- #if defined(ARMA_USE_CXX11)
-
- #undef ARMA_USE_U64S64
- #define ARMA_USE_U64S64
-
- #if !defined(ARMA_32BIT_WORD)
- #undef ARMA_64BIT_WORD
- #define ARMA_64BIT_WORD
- #endif
-
- #if defined(ARMA_64BIT_WORD) && defined(SIZE_MAX)
- #if (SIZE_MAX < 0xFFFFFFFFFFFFFFFFull)
- // #pragma message ("WARNING: disabled use of 64 bit integers, as std::size_t is smaller than 64 bits")
- #undef ARMA_64BIT_WORD
- #endif
- #endif
-
- #endif
- #if defined(ARMA_64BIT_WORD)
- #undef ARMA_USE_U64S64
- #define ARMA_USE_U64S64
- #endif
- // most compilers can't vectorise slightly elaborate loops;
- // for example clang: http://llvm.org/bugs/show_bug.cgi?id=16358
- #undef ARMA_SIMPLE_LOOPS
- #define ARMA_SIMPLE_LOOPS
- #undef ARMA_GOOD_COMPILER
- #undef ARMA_HAVE_TR1
- #undef ARMA_HAVE_GETTIMEOFDAY
- #undef ARMA_HAVE_SNPRINTF
- #undef ARMA_HAVE_ISFINITE
- #undef ARMA_HAVE_LOG1P
- #undef ARMA_HAVE_ISINF
- #undef ARMA_HAVE_ISNAN
- #if (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
- #define ARMA_HAVE_GETTIMEOFDAY
- #endif
- // posix_memalign() is part of IEEE standard 1003.1
- // http://pubs.opengroup.org/onlinepubs/009696899/functions/posix_memalign.html
- // http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/unistd.h.html
- // http://sourceforge.net/p/predef/wiki/Standards/
- #if ( defined(_POSIX_ADVISORY_INFO) && (_POSIX_ADVISORY_INFO >= 200112L) )
- #undef ARMA_HAVE_POSIX_MEMALIGN
- #define ARMA_HAVE_POSIX_MEMALIGN
- #endif
- #if defined(__APPLE__) || defined(__apple_build_version__)
- #undef ARMA_BLAS_SDOT_BUG
- #define ARMA_BLAS_SDOT_BUG
-
- // #undef ARMA_HAVE_POSIX_MEMALIGN
- // NOTE: posix_memalign() is available since macOS 10.6 (late 2009 onwards)
-
- // #undef ARMA_USE_EXTERN_CXX11_RNG
- // NOTE: thread_local seems to work in Apple clang since Xcode 8 (mid 2016 onwards)
- // NOTE: https://stackoverflow.com/questions/28094794/why-does-apple-clang-disallow-c11-thread-local-when-official-clang-supports
- #endif
- #if defined(__MINGW32__) || defined(__CYGWIN__) || defined(_MSC_VER)
- #undef ARMA_HAVE_POSIX_MEMALIGN
- #endif
- #undef ARMA_FNSIG
- #if defined (__GNUG__)
- #define ARMA_FNSIG __PRETTY_FUNCTION__
- #elif defined (_MSC_VER)
- #define ARMA_FNSIG __FUNCSIG__
- #elif defined(__INTEL_COMPILER)
- #define ARMA_FNSIG __FUNCTION__
- #elif defined(ARMA_USE_CXX11)
- #define ARMA_FNSIG __func__
- #else
- #define ARMA_FNSIG "(unknown)"
- #endif
- #if !defined(ARMA_ALLOW_FAKE_GCC)
- #if (defined(__GNUG__) || defined(__GNUC__)) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
- #undef ARMA_DETECTED_FAKE_GCC
- #define ARMA_DETECTED_FAKE_GCC
-
- #pragma message ("WARNING: this compiler is pretending to be GCC but it may not be fully compatible;")
- #pragma message ("WARNING: to allow this compiler to use GCC features such as data alignment attributes,")
- #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_GCC before #include <armadillo>")
- #endif
- #endif
- #if defined(__GNUG__) && (!defined(__clang__) && !defined(ARMA_DETECTED_FAKE_GCC))
-
- // #pragma message ("using GCC extensions")
-
- #undef ARMA_GCC_VERSION
- #define ARMA_GCC_VERSION (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
-
- #if (ARMA_GCC_VERSION < 40800)
- #error "*** newer compiler required; need gcc 4.8 or later ***"
- #endif
-
- #define ARMA_GOOD_COMPILER
-
- #undef arma_hot
- #undef arma_cold
- #undef arma_aligned
- #undef arma_align_mem
- #undef arma_warn_unused
- #undef arma_deprecated
- #undef arma_malloc
- #undef arma_inline
- #undef arma_noinline
-
- #define arma_hot __attribute__((__hot__))
- #define arma_cold __attribute__((__cold__))
- #define arma_aligned __attribute__((__aligned__))
- #define arma_align_mem __attribute__((__aligned__(16)))
- #define arma_warn_unused __attribute__((__warn_unused_result__))
- #define arma_deprecated __attribute__((__deprecated__))
- #define arma_malloc __attribute__((__malloc__))
- #define arma_inline inline __attribute__((__always_inline__))
- #define arma_noinline __attribute__((__noinline__))
-
- #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
- #define ARMA_HAVE_ALIGNED_ATTRIBUTE
-
- #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
- #define ARMA_HAVE_GCC_ASSUME_ALIGNED
-
- #if !defined(ARMA_USE_CXX11) && !defined(__GXX_EXPERIMENTAL_CXX0X__) && (__cplusplus < 201103L) && !defined(ARMA_DONT_USE_TR1)
- #if defined(_GLIBCXX_USE_C99_MATH_TR1) && defined(_GLIBCXX_USE_C99_COMPLEX_TR1)
- #define ARMA_HAVE_TR1
- #endif
- #endif
-
- // gcc's vectoriser can handle elaborate loops
- #undef ARMA_SIMPLE_LOOPS
-
- #if defined(__OPTIMIZE_SIZE__)
- #define ARMA_SIMPLE_LOOPS
- #endif
-
- #if !defined(ARMA_USE_CXX11) && (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
- #define ARMA_HAVE_SNPRINTF
- #define ARMA_HAVE_ISFINITE
- #define ARMA_HAVE_LOG1P
- #define ARMA_HAVE_ISINF
- #define ARMA_HAVE_ISNAN
- #endif
-
- #endif
- #if !defined(ARMA_ALLOW_FAKE_CLANG)
- #if defined(__clang__) && (defined(__INTEL_COMPILER) || defined(__NVCC__) || defined(__CUDACC__) || defined(__PGI) || defined(__PATHSCALE__) || defined(__ARMCC_VERSION) || defined(__IBMCPP__))
- #undef ARMA_DETECTED_FAKE_CLANG
- #define ARMA_DETECTED_FAKE_CLANG
-
- #pragma message ("WARNING: this compiler is pretending to be Clang but it may not be fully compatible;")
- #pragma message ("WARNING: to allow this compiler to use Clang features such as data alignment attributes,")
- #pragma message ("WARNING: #define ARMA_ALLOW_FAKE_CLANG before #include <armadillo>")
- #endif
- #endif
- #if defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG)
-
- // #pragma message ("using Clang extensions")
-
- #define ARMA_GOOD_COMPILER
-
- #if !defined(__has_attribute)
- #define __has_attribute(x) 0
- #endif
-
- #if __has_attribute(__aligned__)
- #undef arma_aligned
- #undef arma_align_mem
-
- #define arma_aligned __attribute__((__aligned__))
- #define arma_align_mem __attribute__((__aligned__(16)))
-
- #undef ARMA_HAVE_ALIGNED_ATTRIBUTE
- #define ARMA_HAVE_ALIGNED_ATTRIBUTE
- #endif
-
- #if __has_attribute(__warn_unused_result__)
- #undef arma_warn_unused
- #define arma_warn_unused __attribute__((__warn_unused_result__))
- #endif
-
- #if __has_attribute(__deprecated__)
- #undef arma_deprecated
- #define arma_deprecated __attribute__((__deprecated__))
- #endif
-
- #if __has_attribute(__malloc__)
- #undef arma_malloc
- #define arma_malloc __attribute__((__malloc__))
- #endif
-
- #if __has_attribute(__always_inline__)
- #undef arma_inline
- #define arma_inline inline __attribute__((__always_inline__))
- #endif
-
- #if __has_attribute(__noinline__)
- #undef arma_noinline
- #define arma_noinline __attribute__((__noinline__))
- #endif
-
- #if __has_attribute(__hot__)
- #undef arma_hot
- #define arma_hot __attribute__((__hot__))
- #endif
-
- #if __has_attribute(__minsize__)
- #undef arma_cold
- #define arma_cold __attribute__((__minsize__))
- #elif __has_attribute(__cold__)
- #undef arma_cold
- #define arma_cold __attribute__((__cold__))
- #endif
-
- #if defined(__has_builtin) && __has_builtin(__builtin_assume_aligned)
- #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
- #define ARMA_HAVE_GCC_ASSUME_ALIGNED
- #endif
-
- #if !defined(ARMA_USE_CXX11) && (defined(_POSIX_C_SOURCE) && (_POSIX_C_SOURCE >= 200112L))
- #define ARMA_HAVE_SNPRINTF
- #define ARMA_HAVE_ISFINITE
- #define ARMA_HAVE_LOG1P
- #define ARMA_HAVE_ISINF
- #define ARMA_HAVE_ISNAN
- #endif
-
- #endif
- #if defined(__INTEL_COMPILER)
-
- #if (__INTEL_COMPILER == 9999)
- #error "*** newer compiler required ***"
- #endif
-
- #if (__INTEL_COMPILER < 1400)
- #error "*** newer compiler required ***"
- #endif
-
- #undef ARMA_HAVE_GCC_ASSUME_ALIGNED
- #undef ARMA_HAVE_ICC_ASSUME_ALIGNED
- #define ARMA_HAVE_ICC_ASSUME_ALIGNED
-
- #if defined(ARMA_USE_CXX11)
- #if (__INTEL_COMPILER < 1500)
- #undef ARMA_PRINT_CXX11_WARNING
- #define ARMA_PRINT_CXX11_WARNING
- #endif
- #endif
-
- #endif
- #if defined(_MSC_VER)
-
- #if (_MSC_VER < 1700)
- #error "*** newer compiler required ***"
- #endif
-
- #if (_MSC_VER < 1800)
- #undef ARMA_PRINT_CXX98_WARNING
- #define ARMA_PRINT_CXX98_WARNING
- #endif
-
- #if defined(ARMA_USE_CXX11)
- #if (_MSC_VER < 1900)
- #undef ARMA_PRINT_CXX11_WARNING
- #define ARMA_PRINT_CXX11_WARNING
- #endif
- #endif
-
- #undef arma_deprecated
- #define arma_deprecated __declspec(deprecated)
- // #undef arma_inline
- // #define arma_inline inline __forceinline
-
- #pragma warning(push)
-
- #pragma warning(disable: 4127) // conditional expression is constant
- #pragma warning(disable: 4180) // qualifier has no meaning
- #pragma warning(disable: 4244) // possible loss of data when converting types (see also 4305)
- #pragma warning(disable: 4510) // default constructor could not be generated
- #pragma warning(disable: 4511) // copy constructor can't be generated
- #pragma warning(disable: 4512) // assignment operator can't be generated
- #pragma warning(disable: 4513) // destructor can't be generated
- #pragma warning(disable: 4514) // unreferenced inline function has been removed
- #pragma warning(disable: 4522) // multiple assignment operators specified
- #pragma warning(disable: 4623) // default constructor can't be generated
- #pragma warning(disable: 4624) // destructor can't be generated
- #pragma warning(disable: 4625) // copy constructor can't be generated
- #pragma warning(disable: 4626) // assignment operator can't be generated
- #pragma warning(disable: 4702) // unreachable code
- #pragma warning(disable: 4710) // function not inlined
- #pragma warning(disable: 4711) // call was inlined
- #pragma warning(disable: 4714) // __forceinline can't be inlined
- #pragma warning(disable: 4800) // value forced to bool
-
- #if defined(ARMA_USE_CXX11)
- #pragma warning(disable: 4519) // default template args are only allowed on a class template
- #endif
-
-
- // #if (_MANAGED == 1) || (_M_CEE == 1)
- //
- // // don't do any alignment when compiling in "managed code" mode
- //
- // #undef arma_aligned
- // #define arma_aligned
- //
- // #undef arma_align_mem
- // #define arma_align_mem
- //
- // #elif (_MSC_VER >= 1700)
- //
- // #undef arma_align_mem
- // #define arma_align_mem __declspec(align(16))
- //
- // #define ARMA_HAVE_ALIGNED_ATTRIBUTE
- //
- // // disable warnings: "structure was padded due to __declspec(align(16))"
- // #pragma warning(disable: 4324)
- //
- // #endif
-
- #endif
- #if defined(__SUNPRO_CC)
-
- // http://www.oracle.com/technetwork/server-storage/solarisstudio/training/index-jsp-141991.html
- // http://www.oracle.com/technetwork/server-storage/solarisstudio/documentation/cplusplus-faq-355066.html
-
- #if (__SUNPRO_CC < 0x5130)
- #error "*** newer compiler required ***"
- #endif
-
- #if defined(ARMA_USE_CXX11)
- #if (__SUNPRO_CC < 0x5140)
- #undef ARMA_PRINT_CXX11_WARNING
- #define ARMA_PRINT_CXX11_WARNING
- #endif
- #endif
-
- #endif
- #if defined(ARMA_USE_CXX11) && defined(__CYGWIN__) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
- #pragma message ("WARNING: Cygwin may have incomplete support for C++11 features.")
- #endif
- #if defined(ARMA_USE_CXX11) && (__cplusplus < 201103L)
- #undef ARMA_PRINT_CXX11_WARNING
- #define ARMA_PRINT_CXX11_WARNING
- #endif
- #if defined(ARMA_PRINT_CXX98_WARNING) && !defined(ARMA_DONT_PRINT_CXX98_WARNING)
- #pragma message ("WARNING: this compiler is OUTDATED and has INCOMPLETE support for the C++ standard;")
- #pragma message ("WARNING: if something breaks, you get to keep all the pieces.")
- #endif
- #if defined(ARMA_PRINT_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
- #pragma message ("WARNING: use of C++11 features has been enabled,")
- #pragma message ("WARNING: but this compiler has INCOMPLETE support for C++11;")
- #pragma message ("WARNING: if something breaks, you get to keep all the pieces.")
- #pragma message ("WARNING: to forcefully prevent Armadillo from using C++11 features,")
- #pragma message ("WARNING: #define ARMA_DONT_USE_CXX11 before #include <armadillo>")
- #endif
- #if ( defined(ARMA_USE_OPENMP) && (!defined(_OPENMP) || (defined(_OPENMP) && (_OPENMP < 201107))) )
- // OpenMP 3.1 required for atomic read and atomic write
- // OpenMP 3.0 required for parallelisation of loops with unsigned integers
- #undef ARMA_USE_OPENMP
- #undef ARMA_PRINT_OPENMP_WARNING
- #define ARMA_PRINT_OPENMP_WARNING
- #endif
- #if defined(ARMA_PRINT_OPENMP_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
- #pragma message ("WARNING: use of OpenMP disabled; compiler support for OpenMP 3.1+ not detected")
-
- #if (defined(_OPENMP) && (_OPENMP < 201107))
- #pragma message ("NOTE: your compiler appears to have an ancient version of OpenMP")
- #pragma message ("NOTE: consider upgrading to a better compiler")
- #endif
- #endif
- #if defined(ARMA_USE_OPENMP) && !defined(ARMA_USE_CXX11)
- #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION >= 50400)) || (defined(__clang__) && !defined(ARMA_DETECTED_FAKE_CLANG))
- #undef ARMA_PRINT_OPENMP_CXX11_WARNING
- #define ARMA_PRINT_OPENMP_CXX11_WARNING
- #endif
- #endif
- #if defined(ARMA_PRINT_OPENMP_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
- #pragma message ("WARNING: support for OpenMP requires C++11/C++14; add -std=c++11 or -std=c++14 to compiler flags")
- #endif
- #if defined(ARMA_USE_OPENMP) && defined(ARMA_USE_CXX11)
- #if (defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION < 50400))
- // due to https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57580
- // TODO: gcc 4.9.4 is also fixed, so use a more fine-grained gcc version check?
- #undef ARMA_USE_OPENMP
- #if !defined(ARMA_DONT_PRINT_OPENMP_WARNING)
- #pragma message ("WARNING: use of OpenMP disabled due to compiler bug in gcc <= 5.3")
- #endif
- #endif
- #endif
- #if defined(ARMA_GCC_VERSION) && (ARMA_GCC_VERSION >= 50400) && !defined(ARMA_USE_CXX11)
- #if !defined(ARMA_PRINT_CXX11_WARNING) && !defined(ARMA_PRINT_OPENMP_CXX11_WARNING) && !defined(ARMA_DONT_PRINT_CXX11_WARNING)
- #pragma message ("NOTE: suggest to enable C++14 mode for faster code; add -std=c++14 to compiler flags")
- #endif
- #endif
- // cleanup
- #undef ARMA_DETECTED_FAKE_GCC
- #undef ARMA_DETECTED_FAKE_CLANG
- #undef ARMA_GCC_VERSION
- #undef ARMA_PRINT_CXX98_WARNING
- #undef ARMA_PRINT_CXX11_WARNING
- #undef ARMA_PRINT_OPENMP_WARNING
- #undef ARMA_PRINT_OPENMP_CXX11_WARNING
- #if defined(log2)
- #undef log2
- #pragma message ("WARNING: detected 'log2' macro and undefined it")
- #endif
- //
- // whoever defined macros with the names "min" and "max" should be permanently removed from the gene pool
- #if defined(min) || defined(max)
- #undef min
- #undef max
- #pragma message ("WARNING: detected 'min' and/or 'max' macros and undefined them;")
- #pragma message ("WARNING: you may wish to define NOMINMAX before including any windows header")
- #endif
- //
- // handle more stupid macros
- // https://sourceware.org/bugzilla/show_bug.cgi?id=19239
- #undef minor
- #undef major
|