/************************************************************************
 *
 * testdefs.h - common testsuite definitions
 *
 * $Id: testdefs.h 580483 2007-09-28 20:55:52Z sebor $
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you 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.
 * Copyright 2005-2006 The Apache Software Foundation or its licensors,
 * as applicable.
 *
 * Copyright 2003-2007 Rogue Wave Software, Inc.
 * 
 **************************************************************************/

#ifndef RW_TESTDEFS_H_INCLUDED
#define RW_TESTDEFS_H_INCLUDED


#include <rw/_defs.h>

#ifdef _RWSTD_TEST_SRC
   // #undef-ine the Compaq C++ macro #defined in response to
   // the -std strict_ansi_errors compiler option in order to
   // allow C++ extensions (such POSIX names) to be declared
   // by C++ libc headers when building the test driver
#  undef __PURE_CNAME
#endif   // _RWSTD_TEST_SRC


#if    (defined (_WIN32) || defined (_WIN64)) \
    && (defined (RWDLL) || defined (_RWSHARED))
#  ifndef _RWSTD_TEST_SRC
     // using a shared lib, import names
#    define _TEST_EXPORT   __declspec (dllimport)
#  else
     // building a shared (test) lib, export names
#    define _TEST_EXPORT   __declspec (dllexport)
#  endif   // _RWSTD_LIB_SRC
#else
#    define _TEST_EXPORT
#endif   // archive/shared library


#if defined (_RWSTD_NO_NAMESPACE) && !defined std
#  define std   /* empty */
#endif   // _RWSTD_NO_NAMESPACE && !std


#if defined (_RWSTD_NO_TYPENAME) && !defined (typename)
#  define typename /* ignore */
#endif   // _RWSTD_NO_TYPENAME && !typename


#if defined (_RWSTD_NO_EXCEPTIONS)
#  ifndef try
#    define try   if (0); else
#  endif   // try
#  ifdef catch
#    define catch   void foo; while (0)
#  endif
#  define RW_CATCH_ALL(ignore)   while (0)
#else   // if !defined (_RWSTD_NO_EXCEPTIONS)
#  define RW_CATCH_ALL(dot_dot_dot)   catch (dot_dot_dot)
#endif   // _RWSTD_NO_EXCEPTIONS

// give the for-init-variable a local scope
#ifdef _RWSTD_NO_FOR_LOCAL_SCOPE
#  define for   if (0); else for
#endif   // _RWSTD_NO_FOR_LOCAL_SCOPE


// convenience macro for exception specification on function pointers
#ifndef _RWSTD_NO_PTR_EXCEPTION_SPEC

#define _PTR_THROWS(spec)   _THROWS (spec)

#else   // if defined (_RWSTD_NO_PTR_EXCEPTION_SPEC)

// throw specs on pointers to functions not implemented...
#define _PTR_THROWS(ignore)

#endif   // _RWSTD_NO_PTR_EXCEPTION_SPEC


// _RWSTD_PRI{d,i,o,u,x}MAX: macros corresponding to those described
// in 7.8.1 of C99; each of them expands to a character string literal
// containing a conversion specifier, possibly modified by a length 
// modifier, suitable for use within the format argument of a formatted
// input/output function when converting the corresponding integer type
#if _RWSTD_LONG_SIZE < _RWSTD_LLONG_SIZE
   // using LLONG_SIZE instead of ULLONG_MAX in the preprocessor
   // conditional above to work around a gcc 3.2 bug (PR #28595)
#  define _RWSTD_PRIdMAX   _RWSTD_LLONG_PRINTF_PREFIX "d"
#  define _RWSTD_PRIiMAX   _RWSTD_LLONG_PRINTF_PREFIX "i"
#  define _RWSTD_PRIoMAX   _RWSTD_LLONG_PRINTF_PREFIX "o"
#  define _RWSTD_PRIuMAX   _RWSTD_LLONG_PRINTF_PREFIX "u"
#  define _RWSTD_PRIxMAX   _RWSTD_LLONG_PRINTF_PREFIX "x"
#elif _RWSTD_INT_SIZE < _RWSTD_LONG_SIZE
#  define _RWSTD_PRIdMAX   "ld"
#  define _RWSTD_PRIiMAX   "li"
#  define _RWSTD_PRIoMAX   "lo"
#  define _RWSTD_PRIuMAX   "lu"
#  define _RWSTD_PRIxMAX   "lx"
#else
#  define _RWSTD_PRIdMAX   "d"
#  define _RWSTD_PRIiMAX   "i"
#  define _RWSTD_PRIoMAX   "o"
#  define _RWSTD_PRIuMAX   "u"
#  define _RWSTD_PRIxMAX   "x"
#endif


// _RWSTD_PRIz: expands to a conversion specifier corresponding
// to "%z" (i.e., C99 size_t specifier)
#if _RWSTD_SIZE_MAX == _RWSTD_UINT_MAX
   // sizeof (size_t) == sizeof (unsigned int)
#  define _RWSTD_PRIz   ""
#elif _RWSTD_SIZE_MAX == _RWSTD_ULONG_MAX
   // sizeof (size_t) == sizeof (unsigned long)
#  define _RWSTD_PRIz   "l"
#elif _RWSTD_SIZE_MAX == _RWSTD_ULLONG_MAX
   // sizeof (size_t) == sizeof (unsigned long long)
#  define _RWSTD_PRIz   _RWSTD_LLONG_PRINTF_PREFIX ""
#else
  // assume sizeof (size_t) == sizeof (unsigned)
#  define _RWSTD_PRIz   ""
#endif


// test assertion
#ifndef _RWSTD_NO_PRETTY_FUNCTION
   // gcc, HP aCC, and Intel C++ all support __PRETTY_FUNCTION__
#  define RW_ASSERT(expr)                                                \
   ((expr) ? (void)0 : _RW::__rw_assert_fail (#expr, __FILE__, __LINE__, \
                                              __PRETTY_FUNCTION__))
#elif !defined (_RWSTD_NO_FUNC)
   // C99 specifies the __func__ special identifier
#  define RW_ASSERT(expr)                                                \
   ((expr) ? (void)0 : _RW::__rw_assert_fail (#expr, __FILE__, __LINE__, \
                                              __func__))
#elif defined (__FUNCSIG__)
   // MSVC macro
#  define RW_ASSERT(expr)                                                \
   ((expr) ? (void)0 : _RW::__rw_assert_fail (#expr, __FILE__, __LINE__, \
                                              __FUNCSIG__))
#else   // if _RWSTD_NO_PRETTY_FUNCTION && _RWSTD_NO_FUNC
#  define RW_ASSERT(expr)   \
   ((expr) ? (void)0 : _RW::__rw_assert_fail (#expr, __FILE__, __LINE__, 0))
#endif   // _RWSTD_NO_PRETTY_FUNCTION, _RWSTD_NO_FUNC

// convenience macro to get number of elements in a c style array
#define RW_COUNT_OF(x) (sizeof(x) / sizeof(*x))

#if defined (__INTEL_COMPILER) && __INTEL_COMPILER <= 1000
   // disable warning #279: controlling expression is constant
   // issued for the commonly used RW_ASSERT(!"not implemented")
#  pragma warning (disable: 279)
#endif   // Intel C++ 10.0 and prior

#endif   // RW_TESTDEFS_H_INCLUDED
