// config_dll.h - written and placed in public domain by Jeffrey Walton
// the bits that make up this source file are from the
// library's monolithic config.h.
/// \file config_dll.h
/// \brief Library configuration file
/// \details config_dll.h provides defines for shared objects and
/// dynamic libraries. Generally speaking the macros are used to export
/// classes and template classes from the Win32 dynamic link library.
/// When not building the Win32 dynamic link library they are mostly an extern
/// template declaration.
/// \details In practice they are a furball coughed up by a cat and then peed
/// on by a dog. They are awful to get just right because of inconsistent
/// compiler support for extern templates, manual instantiation and the FIPS DLL.
/// \details config.h was split into components in May 2019 to better
/// integrate with Autoconf and its feature tests. The splitting occurred so
/// users could continue to include config.h while allowing Autoconf
/// to write new config_asm.h and new config_cxx.h using
/// its feature tests.
/// \note You should include config.h rather than config_dll.h
/// directly.
/// \sa Issue 835,
/// Make config.h more autoconf friendly,
/// Configure.sh script,
/// Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
/// \since Crypto++ 8.3
#ifndef CRYPTOPP_CONFIG_DLL_H
#define CRYPTOPP_CONFIG_DLL_H
#include "config_os.h"
#if defined(CRYPTOPP_DOXYGEN_PROCESSING)
/// \brief Win32 define for dynamic link libraries
/// \details CRYPTOPP_IMPORTS is set in the Visual Studio project files.
/// When the macro is set, CRYPTOPP_DLL is defined to
/// __declspec(dllimport).
/// \details This macro has no effect on Unix & Linux.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_IMPORTS ...
/// \brief Win32 define for dynamic link libraries
/// \details CRYPTOPP_EXPORTS is set in the Visual Studio project files.
/// When the macro is set, CRYPTOPP_DLL is defined to
/// __declspec(dllexport).
/// \details This macro has no effect on Unix & Linux.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_EXPORTS ...
/// \brief Win32 define for dynamic link libraries
/// \details CRYPTOPP_IS_DLL is set in the Visual Studio project files.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_IS_DLL
/// \brief Instantiate templates in a dynamic library
/// \details CRYPTOPP_DLL_TEMPLATE_CLASS decoration should be used
/// for classes intended to be exported from dynamic link libraries.
/// \details This macro is primarily used on Win32, but sees some
/// action on Unix & Linux due to the source file dll.cpp.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_DLL_TEMPLATE_CLASS ...
/// \brief Instantiate templates in a dynamic library
/// \details CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS decoration should be used
/// for template classes intended to be exported from dynamic link libraries.
/// \details This macro is primarily used on Win32, but sees some
/// action on Unix & Linux due to the source file dll.cpp.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS ...
/// \brief Instantiate templates in a dynamic library
/// \details CRYPTOPP_STATIC_TEMPLATE_CLASS decoration should be used
/// for template classes intended to be exported from dynamic link libraries.
/// \details This macro is primarily used on Win32, but sees some
/// action on Unix & Linux due to the source file dll.cpp.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_STATIC_TEMPLATE_CLASS ...
/// \brief Instantiate templates in a dynamic library
/// \details CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS decoration should be used
/// for template classes intended to be exported from dynamic link libraries.
/// \details This macro is primarily used on Win32, but sees some
/// action on Unix & Linux due to the source file dll.cpp.
/// \sa Visual Studio,
/// and FIPS DLL
/// on the Crypto++ wiki
#define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS ...
/// \brief Override for internal linkage
/// \details CRYPTOPP_TABLE can be used to override internal linkage
/// on tables with the const qualifier. According to C++ rules
/// a declaration with const qualifier is internal linkage.
/// \note The name CRYPTOPP_TABLE was chosen because it is often used to
/// export a table, like AES or SHA constants. The name avoids collisions
/// with the DLL gear macros, like CRYPTOPP_EXPORTS and CRYPTOPP_EXTERN.
#define CRYPTOPP_TABLE extern
/// \brief Win32 calling convention
/// \details CRYPTOPP_API sets the calling convention on Win32.
/// On Win32 CRYPTOPP_API is __cedcl. On Unix & Linux
/// CRYPTOPP_API is defined to nothing.
/// \sa Visual Studio
/// on the Crypto++ wiki
#define CRYPTOPP_API ...
#else // CRYPTOPP_DOXYGEN_PROCESSING
#if defined(CRYPTOPP_WIN32_AVAILABLE)
#if defined(CRYPTOPP_EXPORTS)
# define CRYPTOPP_IS_DLL
# define CRYPTOPP_DLL __declspec(dllexport)
#elif defined(CRYPTOPP_IMPORTS)
# define CRYPTOPP_IS_DLL
# define CRYPTOPP_DLL __declspec(dllimport)
#else
# define CRYPTOPP_DLL
#endif
// C++ makes const internal linkage
#define CRYPTOPP_TABLE extern
#define CRYPTOPP_API __cdecl
#else // not CRYPTOPP_WIN32_AVAILABLE
// C++ makes const internal linkage
#define CRYPTOPP_TABLE extern
#define CRYPTOPP_DLL
#define CRYPTOPP_API
#endif // CRYPTOPP_WIN32_AVAILABLE
#if defined(__MWERKS__)
# define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern class CRYPTOPP_DLL
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
# define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
#else
# define CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS extern template class CRYPTOPP_DLL
#endif
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_IMPORTS)
# define CRYPTOPP_DLL_TEMPLATE_CLASS template class CRYPTOPP_DLL
#else
# define CRYPTOPP_DLL_TEMPLATE_CLASS CRYPTOPP_EXTERN_DLL_TEMPLATE_CLASS
#endif
#if defined(__MWERKS__)
# define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern class
#elif defined(__BORLANDC__) || defined(__SUNPRO_CC)
# define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS template class
#else
# define CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS extern template class
#endif
#if defined(CRYPTOPP_MANUALLY_INSTANTIATE_TEMPLATES) && !defined(CRYPTOPP_EXPORTS)
# define CRYPTOPP_STATIC_TEMPLATE_CLASS template class
#else
# define CRYPTOPP_STATIC_TEMPLATE_CLASS CRYPTOPP_EXTERN_STATIC_TEMPLATE_CLASS
#endif
#endif // CRYPTOPP_DOXYGEN_PROCESSING
#endif // CRYPTOPP_CONFIG_DLL_H