diff options
| -rw-r--r-- | CMakeLists.txt | 4 | ||||
| -rw-r--r-- | common/LoggerImpl.cpp | 32 | ||||
| -rw-r--r-- | common/LoggerImpl.h | 56 | ||||
| -rw-r--r-- | compiler/cmake/ServerApp.cmake | 142 | ||||
| -rw-r--r-- | compiler/cmake/sample_d3d11.cmake | 2 | ||||
| -rw-r--r-- | compiler/cmake/test_d3d11.cmake | 2 | ||||
| -rw-r--r-- | include/GFSDK_Logger.h (renamed from common/Logger.h) | 4 | ||||
| -rw-r--r-- | sample/d3d11/ocean_surface.cpp | 4 | ||||
| -rw-r--r-- | sample/d3d11/sample_d3d11.cpp | 8 | ||||
| -rw-r--r-- | src/Entrypoints.cpp | 1 | ||||
| -rw-r--r-- | src/InternalLogger.cpp | 26 | ||||
| -rw-r--r-- | src/InternalLogger.h | 74 |
12 files changed, 211 insertions, 144 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt index 71f4bce..07a7be5 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -128,4 +128,6 @@ SET(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${FINAL_OUTPUT_DIR}) INCLUDE(compiler/cmake/NvWaveWorks.cmake) INCLUDE(compiler/cmake/test_d3d11.cmake) INCLUDE(compiler/cmake/sample_d3d11.cmake) -INCLUDE(compiler/cmake/sample_opengl.cmake) + +# TODO: Switch between CUDA/DirectCompute +#INCLUDE(compiler/cmake/sample_opengl.cmake) diff --git a/common/LoggerImpl.cpp b/common/LoggerImpl.cpp index 9a2921d..9fa81bd 100644 --- a/common/LoggerImpl.cpp +++ b/common/LoggerImpl.cpp @@ -3,10 +3,8 @@ #include <sstream> #include <windows.h> -LoggerWWSamples* g_Logger = nullptr; - LoggerWWSamples::LoggerWWSamples(): -LoggingLevel(nv::LogSeverity::kInfo) + LoggingLevel(nv::LogSeverity::kInfo) { } @@ -27,20 +25,28 @@ void LoggerWWSamples::setLoggingLevel(nv::LogSeverity newLevel) LoggingLevel = newLevel; } -void LoggerWWSamples::log(const char* text, nv::LogSeverity severity, const char* filename, int linenumber) +void LoggerWWSamples::log(nv::LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* format, ...) { - std::ostringstream out; - - out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int) severity] << "] " << text << std::endl; + if (getLoggingLevel() > severity) + return; + + wchar_t buffer[1024]; + + va_list args; + va_start(args, format); +#if NV_GCC_FAMILY +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + _vsnwprintf_s(buffer, sizeof(buffer), format, args); +#if NV_GCC_FAMILY +#pragma GCC diagnostic pop +#endif + va_end(args); - OutputDebugStringA(out.str().c_str()); -} - -void LoggerWWSamples::log(const wchar_t* text, nv::LogSeverity severity, const wchar_t* filename, int linenumber) -{ std::wstringstream out; - out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int)severity] << "] " << text << std::endl; + out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int)severity] << "] " << buffer << std::endl; OutputDebugStringW(out.str().c_str()); } diff --git a/common/LoggerImpl.h b/common/LoggerImpl.h index a07cead..35ac37a 100644 --- a/common/LoggerImpl.h +++ b/common/LoggerImpl.h @@ -1,5 +1,5 @@ #pragma once -#include "Logger.h" +#include "GFSDK_Logger.h" #include <cstdarg> #include <cstdio> @@ -10,58 +10,34 @@ public: LoggerWWSamples(nv::LogSeverity loggingLevel); virtual ~LoggerWWSamples() = default; - virtual void log(const char* text, nv::LogSeverity severity, const char* filename, int linenumber) override; - virtual void log(const wchar_t* text, nv::LogSeverity severity, const wchar_t* filename, int linenumber) override; +// virtual void log(const char* text, nv::LogSeverity severity, const char* filename, int linenumber) override; + virtual void log(nv::LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* format, ...) override; nv::LogSeverity getLoggingLevel(); void setLoggingLevel(nv::LogSeverity newLevel); + static LoggerWWSamples* GetInstance() + { + static LoggerWWSamples Instance; + return &Instance; + } private: nv::LogSeverity LoggingLevel; }; -extern LoggerWWSamples* g_Logger; - -namespace wwsamples -{ - inline void log(nv::LogSeverity severity, const char* filename, int linenumber, const char* format, ...) - { - if (g_Logger == nullptr) - { - g_Logger = new LoggerWWSamples(); - } - - if (g_Logger->getLoggingLevel() > severity) - return; - - char buffer[1024]; - - va_list args; - va_start(args, format); -#if NV_GCC_FAMILY -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" -#endif - vsnprintf_s(buffer, sizeof(buffer), format, args); -#if NV_GCC_FAMILY -#pragma GCC diagnostic pop -#endif - va_end(args); - - g_Logger->log(buffer, severity, filename, linenumber); - } -} - +#ifndef NV_LOG +// NOTE: This assumes we're using wide strings! +#define WIDEWRAP2(s) L##s +#define WIDEWRAP1(s) WIDEWRAP2(s) -#ifndef NV_LOG /// <param name="__VA_ARGS__">format, ...</param> -#define NV_LOG(...) wwsamples::log(nv::LogSeverity::kInfo, __FILE__, __LINE__, __VA_ARGS__) +#define NV_LOG(...) LoggerWWSamples::GetInstance()->log(nv::LogSeverity::kInfo, WIDEWRAP1(__FILE__), __LINE__, __VA_ARGS__) /// <param name="__VA_ARGS__">format, ...</param> -#define NV_WARN(...) wwsamples::log(nv::LogSeverity::kWarning, __FILE__, __LINE__, __VA_ARGS__) +#define NV_WARN(...) LoggerWWSamples::GetInstance()->log(nv::LogSeverity::kWarning, WIDEWRAP1(__FILE__), __LINE__, __VA_ARGS__) /// <param name="__VA_ARGS__">format, ...</param> -#define NV_ERROR(...) wwsamples::log(nv::LogSeverity::kError, __FILE__, __LINE__, __VA_ARGS__) +#define NV_ERROR(...) LoggerWWSamples::GetInstance()->log(nv::LogSeverity::kError, WIDEWRAP1(__FILE__), __LINE__, __VA_ARGS__) /// <param name="__VA_ARGS__">format, ...</param> -#define NV_FATAL(...) wwsamples::log(nv::LogSeverity::kFatal, __FILE__, __LINE__, __VA_ARGS__) +#define NV_FATAL(...) LoggerWWSamples::GetInstance()->log(nv::LogSeverity::kFatal, WIDEWRAP1(__FILE__), __LINE__, __VA_ARGS__) #endif
\ No newline at end of file diff --git a/compiler/cmake/ServerApp.cmake b/compiler/cmake/ServerApp.cmake new file mode 100644 index 0000000..175593a --- /dev/null +++ b/compiler/cmake/ServerApp.cmake @@ -0,0 +1,142 @@ +# +# Build serverapp +# + +SET(GW_DEPS_ROOT $ENV{GW_DEPS_ROOT}) + +SET(TEST_SOURCE_DIR ${PROJECT_SOURCE_DIR}/test/serverapp) +SET(LIB_SOURCE_DIR ${PROJECT_SOURCE_DIR}/src) +SET(COMMON_SOURCE_DIR ${PROJECT_SOURCE_DIR}/common) +SET(SHARED_CS_DIR ${PROJECT_SOURCE_DIR}/test/client-server) +SET(TL_INCLUDE_DIR ${PROJECT_SOURCE_DIR}/include) + +IF(TARGET_BUILD_PLATFORM STREQUAL "Windows") + + SET(WW_PLATFORM_INCLUDES + ) + + SET(WW_PLATFORM_SRC_FILES + ) + + + # Use generator expressions to set config specific preprocessor definitions + SET(WW_COMPILE_DEFS + # Common to all configurations + WIN32;_WINDOWS;_CONSOLE; + + $<$<CONFIG:debug>:PROFILE;> + $<$<CONFIG:release>:NDEBUG;> + ) + + SET(WW_LIBTYPE SHARED) + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "PS4") + + SET(WW_PLATFORM_INCLUDES + $ENV{SCE_ORBIS_SDK_DIR}/target/include + ) + + SET(WW_COMPILE_DEFS + + # Common to all configurations + _LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;PX_PHYSX_STATIC_LIB; + + $<$<CONFIG:debug>:_DEBUG;PX_DEBUG=1;PX_CHECKED=1;PX_SUPPORT_PVD=1;> + $<$<CONFIG:release>:NDEBUG;PX_SUPPORT_PVD=0;> + ) + + SET(WW_LIBTYPE STATIC) + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "XBoxOne") + SET(WW_PLATFORM_INCLUDES + ) + + # Use generator expressions to set config specific preprocessor definitions + SET(WW_COMPILE_DEFS + + # Common to all configurations + PX_PHYSX_CORE_EXPORTS;_LIB;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;WINAPI_FAMILY=WINAPI_FAMILY_TV_TITLE;PX_PHYSX_STATIC_LIB; + + $<$<CONFIG:debug>:_DEBUG;PX_DEBUG=1;PX_CHECKED=1;PX_SUPPORT_PVD=1;> + $<$<CONFIG:release>:NDEBUG;PX_SUPPORT_PVD=0;> + ) + + SET(WW_LIBTYPE STATIC) + + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "Unix") +ENDIF() + +SET(APP_FILES + ${TEST_SOURCE_DIR}/serverapp.cpp + + ${TL_INCLUDE_DIR}/GFSDK_Logger.h + ${COMMON_SOURCE_DIR}/LoggerImpl.h + ${COMMON_SOURCE_DIR}/LoggerImpl.cpp +) + +SET(SHARED_CS_FILES + ${SHARED_CS_DIR}/message_types.h + ${SHARED_CS_DIR}/socket_wrapper.h + ${SHARED_CS_DIR}/socket_wrapper.cpp +) + +ADD_EXECUTABLE(ServerApp WIN32 + ${WW_PLATFORM_SRC_FILES} + + ${APP_FILES} + ${SHARED_CS_FILES} + +) + +SOURCE_GROUP("app" FILES ${APP_FILES}) +SOURCE_GROUP("shared-client-server-code" FILES ${SHARED_CS_FILES}) + + +# Target specific compile options + + +TARGET_INCLUDE_DIRECTORIES(ServerApp + PRIVATE ${WW_PLATFORM_INCLUDES} + + PRIVATE ${TL_INCLUDE_DIR} + PRIVATE ${SHARED_CS_DIR} + PRIVATE ${LIB_SOURCE_DIR} +) + +TARGET_COMPILE_DEFINITIONS(ServerApp + + # Common to all configurations + PRIVATE ${WW_COMPILE_DEFS} +) + + + +#TODO: Link flags + +IF(TARGET_BUILD_PLATFORM STREQUAL "Windows") + # Add linked libraries + TARGET_LINK_LIBRARIES(ServerApp PUBLIC WaveWorks Ws2_32.lib comctl32.lib ${CUDA_LIBRARIES}) + + IF(CMAKE_CL_64) + SET(LIBPATH_SUFFIX "win64") + ELSE(CMAKE_CL_64) + SET(LIBPATH_SUFFIX "Win32") + ENDIF(CMAKE_CL_64) + + SET_TARGET_PROPERTIES(ServerApp PROPERTIES + LINK_FLAGS_DEBUG "/MAP /DEBUG" + LINK_FLAGS_RELEASE "/MAP /INCREMENTAL:NO" + ) + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "PS4") +# TARGET_LINK_LIBRARIES(ServerApp PUBLIC LowLevel LowLevelAABB LowLevelCloth LowLevelDynamics LowLevelParticles ServerAppCommon PxFoundation PxPvdSDK PxTask SceneQuery SimulationController) + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "XBoxOne") + +# TARGET_LINK_LIBRARIES(ServerApp PUBLIC LowLevel LowLevelAABB LowLevelCloth LowLevelDynamics LowLevelParticles ServerAppCommon PxFoundation PxPvdSDK PxTask SceneQuery SimulationController) + +ELSEIF(TARGET_BUILD_PLATFORM STREQUAL "Unix") +ENDIF() + + diff --git a/compiler/cmake/sample_d3d11.cmake b/compiler/cmake/sample_d3d11.cmake index 2d8ddc7..dac6b24 100644 --- a/compiler/cmake/sample_d3d11.cmake +++ b/compiler/cmake/sample_d3d11.cmake @@ -84,7 +84,7 @@ SET(APP_FILES ${SAMP_SOURCE_DIR}/terrain.cpp ${SAMP_SOURCE_DIR}/terrain.h - ${COMMON_SOURCE_DIR}/Logger.h + ${TL_INCLUDE_DIR}/GFSDK_Logger.h ${COMMON_SOURCE_DIR}/LoggerImpl.h ${COMMON_SOURCE_DIR}/LoggerImpl.cpp diff --git a/compiler/cmake/test_d3d11.cmake b/compiler/cmake/test_d3d11.cmake index 68e5e5e..bbc7ca7 100644 --- a/compiler/cmake/test_d3d11.cmake +++ b/compiler/cmake/test_d3d11.cmake @@ -79,7 +79,7 @@ SET(APP_FILES ${TEST_SOURCE_DIR}/ocean_surface.cpp ${TEST_SOURCE_DIR}/ocean_surface.h - ${COMMON_SOURCE_DIR}/Logger.h + ${TL_INCLUDE_DIR}/GFSDK_Logger.h ${COMMON_SOURCE_DIR}/LoggerImpl.h ${COMMON_SOURCE_DIR}/LoggerImpl.cpp ) diff --git a/common/Logger.h b/include/GFSDK_Logger.h index 324b71e..5ad6d77 100644 --- a/common/Logger.h +++ b/include/GFSDK_Logger.h @@ -18,8 +18,8 @@ namespace nv { public: // �filename� is NULL and �linenumber� is 0 in release builds of GameWorks - virtual void log(const char* text, LogSeverity severity, const char* filename, int linenumber) = 0; - virtual void log(const wchar_t* text, LogSeverity severity, const wchar_t* filename, int linenumber) = 0; +// virtual void log(LogSeverity severity, const char* filename, int linenumber, const char* text, ...) = 0; + virtual void log(LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* text, ...) = 0; }; } diff --git a/sample/d3d11/ocean_surface.cpp b/sample/d3d11/ocean_surface.cpp index 3bf11c8..a880db3 100644 --- a/sample/d3d11/ocean_surface.cpp +++ b/sample/d3d11/ocean_surface.cpp @@ -31,7 +31,7 @@ #include "ocean_surface.h" #include "GFSDK_WaveWorks_D3D_Util.h" -#include "../common/Logger.h" +#include "GFSDK_Logger.h" #include "../common/LoggerImpl.h" #pragma warning(disable:4127) @@ -73,7 +73,7 @@ OceanSurface::~OceanSurface() HRESULT OceanSurface::initQuadTree(const GFSDK_WaveWorks_Quadtree_Params& params) { - NV_LOG("Initing the QuadTree"); + NV_LOG(L"Initing the QuadTree"); if(NULL == m_hOceanQuadTree) { diff --git a/sample/d3d11/sample_d3d11.cpp b/sample/d3d11/sample_d3d11.cpp index 929ba11..6383777 100644 --- a/sample/d3d11/sample_d3d11.cpp +++ b/sample/d3d11/sample_d3d11.cpp @@ -46,7 +46,7 @@ #include <locale> #include <codecvt> #include <xlocbuf> -#include "../common/Logger.h" +#include "GFSDK_Logger.h" #include "../common/LoggerImpl.h" //#define DEBUG_VS // Uncomment this line to debug vertex shaders @@ -209,11 +209,11 @@ INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR cmdline, int ) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif - NV_LOG("Testing!"); + NV_LOG(L"Testing!"); - GFSDK_WaveWorks_SetUserLogger(static_cast<nv::ILogger*>(g_Logger)); + GFSDK_WaveWorks_SetUserLogger(static_cast<nv::ILogger*>(LoggerWWSamples::GetInstance())); - NV_LOG("User logger set!"); + NV_LOG(L"User logger set!"); //TODO: Take from cmdline auto mediaPath = "..\\..\\media\\sample"; diff --git a/src/Entrypoints.cpp b/src/Entrypoints.cpp index 953decf..2dd0c15 100644 --- a/src/Entrypoints.cpp +++ b/src/Entrypoints.cpp @@ -48,7 +48,6 @@ #include "orbis\GNM_Util.h" #endif #include "InternalLogger.h" -#include "Logger.h" // Misc helper macros which can be used to bracket entrypoints to: // - catch any and all exceptions, to keep them out of the app diff --git a/src/InternalLogger.cpp b/src/InternalLogger.cpp index e8e8898..de1f750 100644 --- a/src/InternalLogger.cpp +++ b/src/InternalLogger.cpp @@ -27,26 +27,28 @@ void InternalLogger::setLoggingLevel(nv::LogSeverity newLevel) LoggingLevel = newLevel; } -void InternalLogger::log(const char* text, nv::LogSeverity severity, const char* filename, int linenumber) +void InternalLogger::log(nv::LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* format, ...) { if (getLoggingLevel() > severity) return; - std::ostringstream out; + wchar_t buffer[1024]; - out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int)severity] << "] " << text << std::endl; - - OutputDebugStringA(out.str().c_str()); -} - -void InternalLogger::log(const wchar_t* text, nv::LogSeverity severity, const wchar_t* filename, int linenumber) -{ - if (getLoggingLevel() > severity) - return; + va_list args; + va_start(args, format); +#if NV_GCC_FAMILY +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wformat-nonliteral" +#endif + _vsnwprintf_s(buffer, sizeof(buffer), format, args); +#if NV_GCC_FAMILY +#pragma GCC diagnostic pop +#endif + va_end(args); std::wstringstream out; - out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int)severity] << "] " << text << std::endl; + out << filename << "(" << linenumber << "): " << "[" << nv::LogSeverityStrings[(int)severity] << "] " << buffer << std::endl; OutputDebugStringW(out.str().c_str()); } diff --git a/src/InternalLogger.h b/src/InternalLogger.h index d10f263..334519c 100644 --- a/src/InternalLogger.h +++ b/src/InternalLogger.h @@ -1,6 +1,6 @@ #pragma once -#include "Logger.h" +#include "GFSDK_Logger.h" #include <cstdarg> #include <cstdio> #include <wtypes.h> @@ -15,8 +15,8 @@ public: InternalLogger(nv::LogSeverity loggingLevel); virtual ~InternalLogger() = default; - virtual void log(const char* text, nv::LogSeverity severity, const char* filename, int linenumber) override; - virtual void log(const wchar_t* text, nv::LogSeverity severity, const wchar_t* filename, int linenumber) override; +// virtual void log(nv::LogSeverity severity, const char* filename, int linenumber, const char* text, ...) override; + virtual void log(nv::LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* text, ...) override; nv::LogSeverity getLoggingLevel(); void setLoggingLevel(nv::LogSeverity newLevel); @@ -34,75 +34,15 @@ private: extern nv::ILogger* g_UserLogger; -namespace WaveworksInternal -{ - inline void log(nv::LogSeverity severity, const wchar_t* filename, int linenumber, const wchar_t* format, ...) - { - wchar_t buffer[1024]; - - va_list args; - va_start(args, format); -#if NV_GCC_FAMILY -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" -#endif - _vsnwprintf_s(buffer, sizeof(buffer), format, args); -#if NV_GCC_FAMILY -#pragma GCC diagnostic pop -#endif - va_end(args); - - - // Only output to one logger at a time. May not be the desired behaviour. - if (g_UserLogger) - { - g_UserLogger->log(buffer, severity, filename, linenumber); - } - else - { - InternalLogger::GetInstance()->log(buffer, severity, filename, linenumber); - } - - } - - inline void log(nv::LogSeverity severity, const char* filename, int linenumber, const char* format, ...) - { - char buffer[1024]; - - va_list args; - va_start(args, format); -#if NV_GCC_FAMILY -#pragma GCC diagnostic push -#pragma GCC diagnostic ignored "-Wformat-nonliteral" -#endif - vsnprintf_s(buffer, sizeof(buffer), format, args); -#if NV_GCC_FAMILY -#pragma GCC diagnostic pop -#endif - va_end(args); - - // Only output to one logger at a time. May not be the desired behaviour. - if (g_UserLogger) - { - g_UserLogger->log(buffer, severity, filename, linenumber); - } - else - { - InternalLogger::GetInstance()->log(buffer, severity, filename, linenumber); - } - } -} - - #ifndef NV_LOG /// <param name="__VA_ARGS__">format, ...</param> -#define NV_LOG(...) WaveworksInternal::log(nv::LogSeverity::kInfo, __DEF_FILE__, __LINE__, __VA_ARGS__) +#define NV_LOG(...) if (g_UserLogger) { g_UserLogger->log(nv::LogSeverity::kInfo, __DEF_FILE__, __LINE__, __VA_ARGS__); } else { InternalLogger::GetInstance()->log(nv::LogSeverity::kInfo, __DEF_FILE__, __LINE__, __VA_ARGS__); } /// <param name="__VA_ARGS__">format, ...</param> -#define NV_WARN(...) WaveworksInternal::log(nv::LogSeverity::kWarning, __DEF_FILE__, __LINE__, __VA_ARGS__) +#define NV_WARN(...) if (g_UserLogger) { g_UserLogger->log(nv::LogSeverity::kWarning, __DEF_FILE__, __LINE__, __VA_ARGS__); } else { InternalLogger::GetInstance()->log(nv::LogSeverity::kWarning, __DEF_FILE__, __LINE__, __VA_ARGS__); } /// <param name="__VA_ARGS__">format, ...</param> -#define NV_ERROR(...) WaveworksInternal::log(nv::LogSeverity::kError, __DEF_FILE__, __LINE__, __VA_ARGS__) +#define NV_ERROR(...) if (g_UserLogger) { g_UserLogger->log(nv::LogSeverity::kError, __DEF_FILE__, __LINE__, __VA_ARGS__); } else { InternalLogger::GetInstance()->log(nv::LogSeverity::kError, __DEF_FILE__, __LINE__, __VA_ARGS__); } /// <param name="__VA_ARGS__">format, ...</param> -#define NV_FATAL(...) WaveworksInternal::log(nv::LogSeverity::kFatal, __DEF_FILE__, __LINE__, __VA_ARGS__) +#define NV_FATAL(...) if (g_UserLogger) { g_UserLogger->log(nv::LogSeverity::kFatal, __DEF_FILE__, __LINE__, __VA_ARGS__); } else { InternalLogger::GetInstance()->log(nv::LogSeverity::kFatal, __DEF_FILE__, __LINE__, __VA_ARGS__); } #endif
\ No newline at end of file |