/************************************************************************
 *
 * 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 (_MSC_VER) && (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_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

#if    ((4 < __GNUC__) || ((4 == __GNUC__) && (3 < __GNUC_MINOR__))) \
    || (310 < __EDG_VERSION__)
#  define _RWSTD_TT_STRICT_CXX_0X_CONFORM
#endif

#endif   // RW_TESTDEFS_H_INCLUDED
