/* ACC -- Automatic Compiler Configuration
 
 
 
   Copyright (C) 1996-2004 Markus Franz Xaver Johannes Oberhumer
 
   All Rights Reserved.
 
 
 
   This software is a copyrighted work licensed under the terms of
 
   the GNU General Public License. Please consult the file "ACC_LICENSE"
 
   for details.
 
 
 
   Markus F.X.J. Oberhumer
 
   <markus@oberhumer.com>
 
   http://www.oberhumer.com/
 
 */
 
 
 
 
 
#ifndef __ACC_CXX_H_INCLUDED
 
#define __ACC_CXX_H_INCLUDED 1
 
#if defined(__cplusplus)
 
 
 
 
 
/*************************************************************************
 
// exception specification
 
//   ACC_CXX_NOTHROW
 
**************************************************************************/
 
 
 
#if defined(ACC_CXX_NOTHROW)
 
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x020800ul))
 
#elif (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
 
#elif (ACC_CC_HIGHC)
 
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
 
#elif (ACC_CC_NDPC)
 
#elif (ACC_CC_TURBOC)
 
#elif (ACC_CC_WATCOMC && !defined(_CPPUNWIND))
 
#elif (ACC_CC_ZORTECHC)
 
#else
 
#  define ACC_CXX_NOTHROW   throw()
 
#endif
 
 
 
#if !defined(ACC_CXX_NOTHROW)
 
#  define ACC_CXX_NOTHROW
 
#endif
 
 
 
 
 
/*************************************************************************
 
// disable dynamic allocation of an object - private helpers
 
//   __ACC_CXX_DO_NEW
 
//   __ACC_CXX_DO_DELETE
 
**************************************************************************/
 
 
 
#if defined(__ACC_CXX_DO_NEW)
 
#elif (ACC_CC_NDPC || ACC_CC_PGI)
 
#  define __ACC_CXX_DO_NEW          { return 0; }
 
#else
 
#  define __ACC_CXX_DO_NEW          ;
 
#endif
 
 
 
 
 
/* need an implementation in case a class has virtual members */
 
#if defined(__ACC_CXX_DO_DELETE)
 
#elif (ACC_CC_BORLANDC || ACC_CC_TURBOC)
 
#  define __ACC_CXX_DO_DELETE       { }
 
#else
 
#  define __ACC_CXX_DO_DELETE       ACC_CXX_NOTHROW { }
 
#endif
 
 
 
 
 
/*************************************************************************
 
// disable dynamic allocation of an object
 
//   ACC_CXX_DISABLE_NEW_DELETE
 
**************************************************************************/
 
 
 
/*
 
#undef __ACC_CXX_HAVE_ARRAY_NEW
 
#undef __ACC_CXX_HAVE_PLACEMENT_NEW
 
#undef __ACC_CXX_HAVE_PLACEMENT_DELETE
 
*/
 
 
 
#if (ACC_CC_BORLANDC && (__BORLANDC__ < 0x0450))
 
#elif (ACC_CC_MSC && ACC_MM_HUGE)
 
#  define ACC_CXX_DISABLE_NEW_DELETE private:
 
#elif (ACC_CC_MSC && (_MSC_VER < 1100))
 
#elif (ACC_CC_NDPC)
 
#elif (ACC_CC_SYMANTECC || ACC_CC_ZORTECHC)
 
#elif (ACC_CC_TURBOC)
 
#elif (ACC_CC_WATCOMC && (__WATCOMC__ < 1100))
 
#else
 
#  define __ACC_CXX_HAVE_ARRAY_NEW 1
 
#endif
 
 
 
#if (__ACC_CXX_HAVE_ARRAY_NEW)
 
#  define __ACC_CXX_HAVE_PLACEMENT_NEW 1
 
#endif
 
 
 
#if (__ACC_CXX_HAVE_PLACEMENT_NEW)
 
#  if (ACC_CC_GNUC >= 0x030000ul)
 
#    define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
 
#  elif (ACC_CC_INTELC)
 
#    define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
 
#  elif (ACC_CC_MSC && (_MSC_VER >= 1200))
 
#    define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
 
#  elif (ACC_CC_PGI)
 
#    define __ACC_CXX_HAVE_PLACEMENT_DELETE 1
 
#  endif
 
#endif
 
 
 
 
 
#if defined(ACC_CXX_DISABLE_NEW_DELETE)
 
#elif defined(new) || defined(delete)
 
#  define ACC_CXX_DISABLE_NEW_DELETE private:
 
#elif (ACC_CC_GNUC && (ACC_CC_GNUC < 0x025b00ul))
 
#  define ACC_CXX_DISABLE_NEW_DELETE private:
 
#elif  (ACC_CC_HIGHC)
 
#  define ACC_CXX_DISABLE_NEW_DELETE private:
 
#elif !defined(__ACC_CXX_HAVE_ARRAY_NEW)
 
   /* for old compilers use `protected' instead of `private' */
 
#  define ACC_CXX_DISABLE_NEW_DELETE \
 
        protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
 
        protected: static void* operator new(size_t) __ACC_CXX_DO_NEW \
 
        private:
 
#else
 
#  define ACC_CXX_DISABLE_NEW_DELETE \
 
        protected: static void operator delete(void*) __ACC_CXX_DO_DELETE \
 
                   static void operator delete[](void*) __ACC_CXX_DO_DELETE \
 
        private:   static void* operator new(size_t)  __ACC_CXX_DO_NEW \
 
                   static void* operator new[](size_t) __ACC_CXX_DO_NEW
 
#endif
 
 
 
 
 
/*************************************************************************
 
// Assist the compiler by defining a unique location for vtables and RTTI.
 
// Every class which has virtual member functions or derives from a class
 
// with virtual members should put this macro at the very top of its
 
// class declaration.
 
//   ACC_CXX_TRIGGER_FUNCTION
 
**************************************************************************/
 
 
 
#if defined(ACC_CXX_TRIGGER_FUNCTION)
 
#else
 
#  define ACC_CXX_TRIGGER_FUNCTION \
 
        protected: virtual const void* acc_cxx_trigger_function() const; \
 
        private:
 
#endif
 
 
 
#if defined(ACC_CXX_TRIGGER_FUNCTION_IMPL)
 
#else
 
#  define ACC_CXX_TRIGGER_FUNCTION_IMPL(klass) \
 
        const void* klass::acc_cxx_trigger_function() const { return 0; }
 
#endif
 
 
 
 
 
#endif /* __cplusplus */
 
#endif /* already included */
 
 
 
 
 
/*
 
vi:ts=4:et
 
*/