/************************************************************************
 *
 * testdefs.h - common testsuite definitions
 *
 * $Id$
 *
 ***************************************************************************
 *
 * 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
