/* ///////////////////////////////////////////////////////////////////////// * File: pantheios/pantheios.hpp * * Purpose: Primary header file for Pantheios * * Created: 21st June 2005 * Updated: 9th January 2011 * * Home: http://www.pantheios.org/ * * Copyright (c) 2005-2011, Matthew Wilson and Synesis Software * Copyright (c) 1999-2005, Synesis Software and Matthew Wilson * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * - Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - Neither the name(s) of Matthew Wilson and Synesis Software nor the * names of any contributors may be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * ////////////////////////////////////////////////////////////////////// */ /** \file pantheios/pantheios.hpp * * [C++ only] Primary header file for the * \ref group__application_layer_interface, and included in all * C++ compilation units. * * Users should include this file to ensure that the Pantheios library is * automatically initialised, and to access * the \ref group__application_layer_interface. */ #ifndef PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS #define PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS /* ///////////////////////////////////////////////////////////////////////// * Version information */ #ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION # define PANTHEIOS_VER_PANTHEIOS_HPP_PANTHEIOS_MAJOR 3 # define PANTHEIOS_VER_PANTHEIOS_HPP_PANTHEIOS_MINOR 9 # define PANTHEIOS_VER_PANTHEIOS_HPP_PANTHEIOS_REVISION 2 # define PANTHEIOS_VER_PANTHEIOS_HPP_PANTHEIOS_EDIT 102 #endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */ /* ///////////////////////////////////////////////////////////////////////// * Includes */ /* Main Pantheios Header */ #ifndef PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS # include #endif /* !PANTHEIOS_INCL_PANTHEIOS_H_PANTHEIOS */ #ifndef __cplusplus # error pantheios/pantheios.hpp is only valid in C++ compilation units #endif /* !__cplusplus */ /* Required to validate the parameters are not integral types */ #ifndef STLSOFT_INCL_STLSOFT_META_HPP_IS_FUNDAMENTAL_TYPE # include #endif /* !STLSOFT_INCL_STLSOFT_META_HPP_IS_FUNDAMENTAL_TYPE */ /* Now select various headers to bring in string access shims */ #ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_H_FWD # include #endif /* !STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_H_FWD */ /* Backwards-compatibility */ #ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION # if defined(PANTHEIOS_NO_INCLUDE_STLSOFT_SHIM_ACCESS_SHIMS) && \ !defined(PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS) # ifdef STLSOFT_CF_PRAGMA_MESSAGE_SUPPORT # pragma messsage("The symbol PANTHEIOS_NO_INCLUDE_STLSOFT_SHIM_ACCESS_SHIMS is deprecated, and support for it will be removed before 1.0.1. Please use PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS instead.") # endif /* STLSOFT_CF_PRAGMA_MESSAGE_SUPPORT */ # define PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS # endif /* PANTHEIOS_NO_INCLUDE_STLSOFT_SHIM_ACCESS_SHIMS && !PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS */ #endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */ #ifdef PANTHEIOS_CUSTOM_SHIM_INCLUDE # include PANTHEIOS_CUSTOM_SHIM_INCLUDE #else /* ? PANTHEIOS_CUSTOM_SHIM_INCLUDE */ # if !defined(PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS) # ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING # include # endif /* !STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_HPP_STRING */ # ifndef STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_STD_HPP_TIME # include # endif /* !STLSOFT_INCL_STLSOFT_SHIMS_ACCESS_STRING_STD_HPP_TIME */ # ifdef PANTHEIOS_NO_INCLUDE_OS_AND_3PTYLIB_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_ACESTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_ATLSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_COMSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_MFCSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_PLATFORMSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_UNIXSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_WINSTL_STRING_ACCESS # define PANTHEIOS_NO_INCLUDE_WTLSTL_STRING_ACCESS # endif /* PANTHEIOS_NO_INCLUDE_OS_AND_3PTYLIB_STRING_ACCESS */ /* Include shims for MFC, if * * - it's not been proscribed, by PANTHEIOS_NO_INCLUDE_MFCSTL_STRING_ACCESS, and either * - it's been explicitly requested, by PANTHEIOS_FORCE_INCLUDE_MFCSTL_STRING_ACCESS, or * - _AFX and _MFC_VER are defined */ # if !defined(PANTHEIOS_NO_INCLUDE_MFCSTL_STRING_ACCESS) && \ ( defined(PANTHEIOS_FORCE_INCLUDE_MFCSTL_STRING_ACCESS) || \ defined(_AFXDLL) || \ ( defined(_AFX) && \ defined(_MFC_VER))) # ifndef MFCSTL_INCL_MFCSTL_SHIMS_ACCESS_HPP_STRING # include # endif /* !MFCSTL_INCL_MFCSTL_SHIMS_ACCESS_HPP_STRING */ # endif /* MFC */ /* Include shims for ATL, if * * - it's not been proscribed, by PANTHEIOS_NO_INCLUDE_ATLSTL_STRING_ACCESS, and either * - it's been explicitly requested, by PANTHEIOS_FORCE_INCLUDE_ATLSTL_STRING_ACCESS, or * - _ATL and _ATL_VER are defined */ # if !defined(PANTHEIOS_NO_INCLUDE_ATLSTL_STRING_ACCESS) && \ ( defined(PANTHEIOS_FORCE_INCLUDE_ATLSTL_STRING_ACCESS) || \ ( defined(_ATL) && \ defined(_ATL_VER))) # ifndef ATLSTL_INCL_ATLSTL_SHIMS_ACCESS_HPP_STRING # include # endif /* !ATLSTL_INCL_ATLSTL_SHIMS_ACCESS_HPP_STRING */ # endif /* ATL */ /* Include shims for COM, if * * - it's not been proscribed, by PANTHEIOS_NO_INCLUDE_COMSTL_STRING_ACCESS, and either * - it's been explicitly requested, by PANTHEIOS_FORCE_INCLUDE_COMSTL_STRING_ACCESS, or * - WIN32/WIN64 is defined */ # if !defined(PANTHEIOS_NO_INCLUDE_COMSTL_STRING_ACCESS) && \ ( defined(PANTHEIOS_FORCE_INCLUDE_COMSTL_STRING_ACCESS) || \ defined(WIN32) || \ defined(WIN64)) # ifndef COMSTL_INCL_COMSTL_SHIMS_ACCESS_HPP_STRING # include # endif /* !COMSTL_INCL_COMSTL_SHIMS_ACCESS_HPP_STRING */ # endif /* COM */ /* Include shims for UNIX, if * * - it's not been proscribed, by PANTHEIOS_NO_INCLUDE_UNIXSTL_STRING_ACCESS, and either * - it's been explicitly requested, by PANTHEIOS_FORCE_INCLUDE_UNIXSTL_STRING_ACCESS, or * - unix, __unix, __unix__ or UNIX is defined */ # if !defined(PANTHEIOS_NO_INCLUDE_UNIXSTL_STRING_ACCESS) && \ ( defined(PANTHEIOS_FORCE_INCLUDE_UNIXSTL_STRING_ACCESS) || \ ( defined(unix) || \ defined(__unix) || \ defined(__unix__) || \ defined(UNIX))) # ifndef UNIXSTL_INCL_UNIXSTL_SHIMS_ACCESS_HPP_STRING # include # endif /* !UNIXSTL_INCL_UNIXSTL_SHIMS_ACCESS_HPP_STRING */ # endif /* UNIX */ /* Include shims for Windows, if * * - it's not been proscribed, by PANTHEIOS_NO_INCLUDE_WINSTL_STRING_ACCESS, and either * - it's been explicitly requested, by PANTHEIOS_FORCE_INCLUDE_WINSTL_STRING_ACCESS, or * - WIN32/WIN64 is defined */ # if !defined(PANTHEIOS_NO_INCLUDE_WINSTL_STRING_ACCESS) && \ ( defined(PANTHEIOS_FORCE_INCLUDE_WINSTL_STRING_ACCESS) || \ defined(WIN32) || \ defined(WIN64)) # ifndef WINSTL_INCL_WINSTL_SHIMS_ACCESS_HPP_STRING # include # endif /* !WINSTL_INCL_WINSTL_SHIMS_ACCESS_HPP_STRING */ # ifndef WINSTL_INCL_WINSTL_SHIMS_ACCESS_STRING_HPP_TIME # include # endif /* !WINSTL_INCL_WINSTL_SHIMS_ACCESS_STRING_HPP_TIME */ # endif /* Win */ # endif /* !PANTHEIOS_NO_INCLUDE_STLSOFT_STRING_ACCESS */ #endif /* PANTHEIOS_CUSTOM_SHIM_INCLUDE */ /* ///////////////////////////////////////////////////////////////////////// * GCC bug */ /* NOTE: We must include here, as GCC is a bit * thick about its two-phase name lookup when resolving shim functions for * the Pantheios inserter types integer, pointer and real. */ #if defined(STLSOFT_COMPILER_IS_GCC) && \ __GNUC__ < 4 //# include #endif /* compiler */ /* ///////////////////////////////////////////////////////////////////////// * Namespace */ #if !defined(PANTHEIOS_NO_NAMESPACE) namespace pantheios { #endif /* !PANTHEIOS_NO_NAMESPACE */ /* ///////////////////////////////////////////////////////////////////////// * C++ API components * * To suppress all generated functions, define the preprocessor symbol * PANTHEIOS_NO_GENERATED_FUNCTIONS * * To suppress all log() generated functions, define the preprocessor * symbol * PANTHEIOS_NO_LOG_FUNCTIONS * * To suppress all log-specific generated functions (i.e. log_DEBUG(), * log_CRITICAL(), etc.), define the preprocessor symbol * PANTHEIOS_NO_LOG_SEV_FUNCTIONS. Note: if the symbol * PANTHEIOS_NO_STOCK_LEVELS is defined, then * PANTHEIOS_NO_LOG_SEV_FUNCTIONS will be defined * automatically. */ #ifdef PANTHEIOS_NO_STOCK_LEVELS # ifndef PANTHEIOS_NO_LOG_SEV_FUNCTIONS # define PANTHEIOS_NO_LOG_SEV_FUNCTIONS # endif /* !PANTHEIOS_NO_LOG_SEV_FUNCTIONS */ #endif /* PANTHEIOS_NO_STOCK_LEVELS */ #ifdef PANTHEIOS_INVOKE_SHIM_PAIR_ # undef PANTHEIOS_INVOKE_SHIM_PAIR_ #endif /* PANTHEIOS_INVOKE_SHIM_PAIR_ */ #ifdef PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_ # undef PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_ #endif /* PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_ */ /* ///////////////////////////////////////////////////////////////////////// * Compiler compatibility */ /* The Digital Mars and GCC compilers both exhibit strange behaviour (bugs?) * with respect to the invocation of shims. * * - DMC++ requires explicit qualification, even in the presence of a * (local) using declaration * - GCC requires a local using declaration and *must not* have explicit * qualification. * * - all other compilers work fine without any using declaration and with * explicit qualification. * * As currently defined, we follow the GCC way (which works for all other * compilers, except DMC++), and explicitly qualify for DMC++. * */ #ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION # ifdef PANTHEIOS_INVOKE_c_str_data_ # undef PANTHEIOS_INVOKE_c_str_data_ # endif /* PANTHEIOS_INVOKE_c_str_data_ */ # ifdef PANTHEIOS_INVOKE_c_str_len_ # undef PANTHEIOS_INVOKE_c_str_len_ # endif /* PANTHEIOS_INVOKE_c_str_len_ */ # ifdef PANTHEIOS_INVOKE_c_str_ptr_ # undef PANTHEIOS_INVOKE_c_str_ptr_ # endif /* PANTHEIOS_INVOKE_c_str_ptr_ */ # ifdef PANTHEIOS_INVOKE_SHIM_PAIR_ # undef PANTHEIOS_INVOKE_SHIM_PAIR_ # endif /* PANTHEIOS_INVOKE_SHIM_PAIR_ */ # ifdef PANTHEIOS_c_str_data_name_ # undef PANTHEIOS_c_str_data_name_ # endif /* PANTHEIOS_c_str_data_name_ */ # ifdef PANTHEIOS_USE_WIDE_STRINGS # define PANTHEIOS_c_str_data_name_ c_str_data_w # define PANTHEIOS_c_str_len_name_ c_str_len_w # define PANTHEIOS_c_str_ptr_name_ c_str_ptr_w # else /* ? PANTHEIOS_USE_WIDE_STRINGS */ # define PANTHEIOS_c_str_data_name_ c_str_data_a # define PANTHEIOS_c_str_len_name_ c_str_len_a # define PANTHEIOS_c_str_ptr_name_ c_str_ptr_a # endif /* PANTHEIOS_USE_WIDE_STRINGS */ # if defined(STLSOFT_COMPILER_IS_DMC) # define PANTHEIOS_DECLARE_SHIM_PAIR_() ((void)0) # define PANTHEIOS_INVOKE_SHIM_PAIR_(x) stlsoft::PANTHEIOS_c_str_len_name_(x), stlsoft::PANTHEIOS_c_str_data_name_(x) # elif defined(STLSOFT_COMPILER_IS_GCC) # define PANTHEIOS_DECLARE_SHIM_PAIR_() using ::stlsoft::PANTHEIOS_c_str_data_name_; using ::stlsoft::PANTHEIOS_c_str_len_name_ # define PANTHEIOS_INVOKE_SHIM_PAIR_(x) PANTHEIOS_c_str_len_name_(x), PANTHEIOS_c_str_data_name_(x) # else /* ? compiler */ # define PANTHEIOS_DECLARE_SHIM_PAIR_() using ::stlsoft::PANTHEIOS_c_str_data_name_; using ::stlsoft::PANTHEIOS_c_str_len_name_ # define PANTHEIOS_INVOKE_SHIM_PAIR_(x) PANTHEIOS_c_str_len_name_(x), PANTHEIOS_c_str_data_name_(x) # endif /* compiler */ # define PANTHEIOS_VALIDATE_TYPE_NOT_FUNDAMENTAL_(t) STLSOFT_STATIC_ASSERT(0 == stlsoft::is_fundamental_type::value) #endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */ #ifndef PANTHEIOS_NO_GENERATED_FUNCTIONS # ifndef PANTHEIOS_DOCUMENTATION_SKIP_SECTION namespace internal { # include "./internal/generated/log_dispatch_functions.h" # include "./internal/generated/log_dispatch_functions.hpp" } /* namespace internal */ # endif /* !PANTHEIOS_DOCUMENTATION_SKIP_SECTION */ # if !defined(PANTHEIOS_NO_LOG_FUNCTIONS) # include "./internal/generated/log_functions.hpp" // log(s), log(s, s) etc etc # endif /* !PANTHEIOS_NO_LOG_FUNCTIONS */ # if !defined(PANTHEIOS_NO_LOG_SEV_FUNCTIONS) # include "./internal/generated/log_sev_functions.hpp" // log_ALERT() overloads, log_ERROR() overloads, etc. # endif /* !PANTHEIOS_NO_LOG_SEV_FUNCTIONS */ #endif /* !PANTHEIOS_NO_GENERATED_FUNCTIONS */ #undef PANTHEIOS_INVOKE_SHIM_PAIR_ /* ///////////////////////////////////////////////////////////////////////// * Namespace */ #if !defined(PANTHEIOS_NO_NAMESPACE) } /* namespace pantheios */ #endif /* !PANTHEIOS_NO_NAMESPACE */ /* ///////////////////////////////////////////////////////////////////////// * Auto-initialisation * * Except when making a DLL, this is automatic, unless PANTHEIOS_NO_AUTO_INIT * is defined. * * To force it for a DLL, define PANTHEIOS_FORCE_AUTO_INIT */ #if defined(__DLL__) /* Borland, with -WD */ || \ defined(_WINDLL) /* VC++, defined by user/wizard */ || \ defined(_USRDLL) /* VC++, defined by user/wizard */ # define PANTHEIOS_NO_AUTO_INIT #endif /* dynamic library */ #if defined(PANTHEIOS_FORCE_AUTO_INIT) || \ !defined(PANTHEIOS_NO_AUTO_INIT) # include "./internal/initialiser.hpp" // Schwarz counter initialisation #endif /* PANTHEIOS_FORCE_AUTO_INIT || !PANTHEIOS_NO_AUTO_INIT */ /* ///////////////////////////////////////////////////////////////////////// * Inclusion */ #ifdef STLSOFT_PPF_pragma_once_SUPPORT # pragma once #endif /* STLSOFT_PPF_pragma_once_SUPPORT */ /* ////////////////////////////////////////////////////////////////////// */ #endif /* !PANTHEIOS_INCL_PANTHEIOS_HPP_PANTHEIOS */ /* ///////////////////////////// end of file //////////////////////////// */