You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
1057 lines
28 KiB
1057 lines
28 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
/* |
|
* |
|
* Copyright (c) 1998-9 |
|
* Dr John Maddock |
|
* |
|
* Permission to use, copy, modify, distribute and sell this software |
|
* and its documentation for any purpose is hereby granted without fee, |
|
* provided that the above copyright notice appear in all copies and |
|
* that both that copyright notice and this permission notice appear |
|
* in supporting documentation. Dr John Maddock makes no representations |
|
* about the suitability of this software for any purpose. |
|
* It is provided "as is" without express or implied warranty. |
|
* |
|
*/ |
|
|
|
/* |
|
* FILE jm_cfg.h |
|
* VERSION 2.12 |
|
*/ |
|
|
|
#ifndef JM_CFG_H |
|
#define JM_CFG_H |
|
|
|
/************************************************************************ |
|
|
|
The purpose of this header is to provide compiler and STL configuration |
|
options. Options fall into three categaries (namespaces, compiler and STL), |
|
throughout, the defaults assume that the compiler and STL are fully C++ standard |
|
compliant, features that are not supported on your system may be selectively |
|
turned off by defining the appropriate macros. Borland C++, Borland C++ Builder, |
|
and Microsoft Visual C++ should be auto-recognised and configured. The HP aCC and |
|
SunPro C++ compiler should also be supported - but run configure for best results. |
|
The SGI, HP, Microsoft and Rogue Wave STL's should be auto-recognised and configured. |
|
Do not change this file unless you really really have to, add options to |
|
<jm_opt.h> instead. See <jm_opt.h> for a full list of macros and their usage. |
|
|
|
************************************************************************/ |
|
|
|
#include <jm/jm_opt.h> |
|
#include <stdlib.h> |
|
#include <stddef.h> |
|
|
|
/* this will increase in future versions: */ |
|
#define JM_VERSION 212 |
|
|
|
#ifndef JM_AUTO_CONFIGURE |
|
#if defined(__WIN32__) || defined(_WIN32) || defined(WIN32) |
|
#define JM_PLATFORM_W32 |
|
#endif |
|
|
|
#ifdef __BORLANDC__ |
|
|
|
#if __BORLANDC__ < 0x500 |
|
#define JM_NO_NAMESPACES |
|
#define JM_NO_BOOL |
|
#define JM_NO_MUTABLE |
|
#endif |
|
|
|
#if __BORLANDC__ < 0x520 |
|
#define JM_NO_WCSTRING |
|
#define JM_NO_INT64 |
|
// Early versions of Borlands namespace code can't cope with iterators |
|
// that are in different namespaces from STL code. |
|
#define __JM std |
|
#define JM_NO_NOT_EQUAL |
|
#endif |
|
|
|
#if __BORLANDC__ < 0x530 |
|
#define JM_NO_WCTYPE_H |
|
#define JM_NO_WCHAR_H |
|
#define JM_OLD_IOSTREAM |
|
#define __JM_STDC |
|
#define JM_NO_TRICKY_DEFAULT_PARAM |
|
#define JM_NO_EXCEPTION_H |
|
#ifndef __WIN32__ |
|
#define JM_NO_WCSTRING |
|
#endif |
|
#define JM_NO_LOCALE_H |
|
#define JM_NO_TEMPLATE_RETURNS |
|
#define JM_TEMPLATE_SPECIALISE |
|
#endif |
|
|
|
#if __BORLANDC__ < 0x540 |
|
#define JM_NO_MEMBER_TEMPLATES |
|
// inline contructors exhibit strange behaviour |
|
// under Builder 3 and C++ 5.x when throwing exceptions |
|
#define INLINE_EXCEPTION_BUG |
|
#define JM_NESTED_TEMPLATE_DECL |
|
#define JM_NO_PARTIAL_FUNC_SPEC |
|
#define JM_NO_STRING_DEF_ARGS |
|
#define JM_NO_TYPEINFO // bad_cast etc not in namespace std. |
|
#endif |
|
// |
|
// Builder 4 seems to have broken template friend support: |
|
#define JM_NO_TEMPLATE_FRIEND |
|
|
|
#ifndef _CPPUNWIND |
|
#define JM_NO_EXCEPTIONS |
|
#endif |
|
|
|
#ifdef _Windows |
|
#define JM_PLATFORM_WINDOWS |
|
#else |
|
#define JM_PLATFORM_DOS |
|
#endif |
|
|
|
#ifndef __WIN32__ |
|
#define RE_CALL |
|
#define RE_CCALL |
|
#else |
|
#define RE_CALL __fastcall |
|
#define RE_CCALL __stdcall |
|
#endif |
|
|
|
#define JM_INT64t __int64 |
|
#define JM_IMM64(val) val##i64 |
|
#define JM_NO_CAT |
|
|
|
#ifdef __MT__ |
|
#define JM_THREADS |
|
#endif |
|
|
|
// |
|
// import export options: |
|
#ifdef _RTLDLL |
|
#ifdef RE_BUILD_DLL |
|
#define JM_IX_DECL __declspec( dllexport ) |
|
#else |
|
#define JM_IX_DECL __declspec( dllimport ) |
|
#endif |
|
#endif |
|
#include <jm/re_lib.h> |
|
#endif |
|
|
|
#ifdef _MSC_VER |
|
#define RE_CALL __fastcall |
|
#define RE_CCALL __stdcall |
|
|
|
#if _MSC_VER < 1100 |
|
#define JM_NO_NAMESPACES |
|
#define JM_NO_DEFAULT_PARAM |
|
#define JM_NO_BOOL |
|
#define JM_NO_MUTABLE |
|
#define JM_NO_WCSTRING |
|
#define JM_NO_LOCALE_H |
|
#define JM_NO_TEMPLATE_RETURNS |
|
#define JM_NO_INT64 |
|
#endif |
|
|
|
#if _MSC_VER < 1200 |
|
#define JM_TEMPLATE_SPECIALISE |
|
#define JM_NESTED_TEMPLATE_DECL |
|
#endif |
|
|
|
#ifndef _CPPUNWIND |
|
#define JM_NO_EXCEPTIONS |
|
#endif |
|
|
|
#define __JM_STDC |
|
#define JM_PLATFORM_WINDOWS |
|
// |
|
// no support for nested template classes yet.... |
|
// although this part of VC6 is badly documented |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#define JM_INT64t __int64 |
|
#define JM_IMM64(val) val##i64 |
|
#define JM_NO_CAT |
|
#define JM_NO_PARTIAL_FUNC_SPEC |
|
#define JM_NO_TEMPLATE_FRIEND |
|
|
|
#ifdef _MT |
|
#define JM_THREADS |
|
#endif |
|
|
|
#pragma warning(disable: 4786) |
|
#pragma warning(disable: 4800) |
|
#pragma warning(disable: 4200) |
|
|
|
// |
|
// import export options: |
|
#ifdef _DLL |
|
#ifdef RE_BUILD_DLL |
|
#define JM_IX_DECL __declspec( dllexport ) |
|
#else |
|
#define JM_IX_DECL __declspec( dllimport ) |
|
#endif |
|
#endif |
|
#include <jm/re_lib.h> |
|
#endif |
|
|
|
#ifdef __GNUC__ |
|
#if (__GNUC__ < 2) || ((__GNUC__ == 2) && (__GNUC_MINOR__ < 91)) |
|
#define JM_NO_NAMESPACES |
|
#define JM_NO_MUTABLE |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#define JM_NO_PARTIAL_FUNC_SPEC |
|
#define JM_NO_TEMPLATE_FRIEND |
|
#endif |
|
#ifndef __STL_USE_NAMESPACES |
|
#define JM_NO_EXCEPTION_H |
|
#endif |
|
#define JM_INT64t long long |
|
#define JM_IMM64(val) val##LL |
|
|
|
#ifdef _WIN32 |
|
#define JM_PLATFORM_WINDOWS |
|
#define JM_NO_WCTYPE_H |
|
//#define JM_NO_TEMPLATE_SWITCH_MERGE |
|
#endif |
|
#define JM_NO_CAT |
|
#define OLD_IOSTREAM |
|
#define JM_NESTED_TEMPLATE_DECL |
|
#define JM_NO_TEMPLATE_TYPENAME |
|
|
|
#endif |
|
|
|
#ifdef __SUNPRO_CC |
|
#if (__SUNPRO_CC < 0x500) |
|
#define JM_NO_NAMESPACES |
|
#define JM_NO_MUTABLE |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#define OLD_IOSTREAM |
|
#endif |
|
#ifndef __STL_USE_NAMESPACES |
|
#define JM_NO_EXCEPTION_H |
|
#endif |
|
#define JM_INT64t long long |
|
#define JM_IMM64(val) val##LL |
|
#define JM_NESTED_TEMPLATE_DECL |
|
#define JM_NO_TEMPLATE_TYPENAME |
|
#define JM_NO_SWPRINTF |
|
#define JM_NO_TEMPLATE_FRIEND |
|
#endif |
|
|
|
#ifdef __HP_aCC |
|
// putative HP aCC support, run configure for |
|
// support tailored to your system.... |
|
#define JM_NO_NAMESPACES |
|
#define JM_NO_MUTABLE |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#define OLD_IOSTREAM |
|
#ifndef __STL_USE_NAMESPACES |
|
#define JM_NO_EXCEPTION_H |
|
#endif |
|
#define JM_INT64t long long |
|
#define JM_IMM64(val) val##LL |
|
#define JM_NESTED_TEMPLATE_DECL |
|
#define JM_NO_TEMPLATE_TYPENAME |
|
#define JM_NO_TEMPLATE_FRIEND |
|
#endif |
|
|
|
|
|
|
|
#endif // JM_AUTO_CONFIGURE |
|
|
|
#ifndef JM_NO_WCSTRING |
|
#ifndef JM_NO_WCTYPE_H |
|
#include <wctype.h> |
|
#endif |
|
#ifndef JM_NO_WCHAR_H |
|
#include <wchar.h> |
|
#endif |
|
#endif |
|
|
|
#ifdef JM_NO_NAMESPACES |
|
#define JM_MAYBE_ACCESS_SPEC :: |
|
#else |
|
#define JM_MAYBE_ACCESS_SPEC __JM:: |
|
#endif |
|
|
|
#if !defined(JM_INT64t) || !defined(JM_IMM64) |
|
#define JM_NO_INT64 |
|
#endif |
|
|
|
#ifndef JM_INT32 |
|
typedef unsigned int jm_uintfast32_t; |
|
#else |
|
typedef JM_INT32 jm_uintfast32_t; |
|
#endif |
|
|
|
#ifndef JM_TEMPLATE_SPECIALISE |
|
#define JM_TEMPLATE_SPECIALISE template <> |
|
#endif |
|
|
|
#ifndef JM_NESTED_TEMPLATE_DECL |
|
#define JM_NESTED_TEMPLATE_DECL template |
|
#endif |
|
|
|
#ifndef JM_IX_DECL |
|
#define JM_IX_DECL |
|
#endif |
|
|
|
#ifndef MB_CUR_MAX |
|
// yuk! |
|
// better make a conservative guess! |
|
#define MB_CUR_MAX 10 |
|
#endif |
|
|
|
|
|
/* everything else is C++: */ |
|
|
|
#ifdef __cplusplus |
|
|
|
/* define macro's to make default parameter declaration easier: */ |
|
|
|
#ifdef JM_NO_DEFAULT_PARAM |
|
#define JM_DEFAULT_PARAM(x) |
|
#define JM_TRICKY_DEFAULT_PARAM(x) |
|
#elif defined(JM_NO_TRICKY_DEFAULT_PARAM) |
|
#define JM_DEFAULT_PARAM(x) = x |
|
#define JM_TRICKY_DEFAULT_PARAM(x) |
|
#else |
|
#define JM_DEFAULT_PARAM(x) = x |
|
#define JM_TRICKY_DEFAULT_PARAM(x) = x |
|
#endif |
|
|
|
/* STL configuration goes here: */ |
|
|
|
#ifndef JM_AUTO_CONFIGURE |
|
#ifdef JM_NO_STL |
|
#define JM_NO_EXCEPTION_H |
|
#define JM_NO_ITERATOR_H |
|
#define JM_NO_MEMORY_H |
|
#define JM_NO_LOCALE_H |
|
#define JM_NO_STRING_H |
|
#endif |
|
|
|
#ifndef JM_NO_EXCEPTION_H |
|
#include <exception> |
|
#endif |
|
|
|
#ifndef JM_NO_ITERATOR_H |
|
#include <iterator> |
|
|
|
#if defined(__SGI_STL_INTERNAL_ITERATOR_H) || defined(__SGI_STL_ITERATOR_H) |
|
#define JM_NO_LOCALE_H |
|
#define OLD_IOSTREAM |
|
|
|
/* we are using SGI's STL |
|
some of these (__JM_STDC) |
|
may be guesswork: */ |
|
#if !defined(__STL_MEMBER_TEMPLATE_CLASSES) || !defined(__STL_MEMBER_TEMPLATES) |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#endif |
|
|
|
#if !defined( __JM_STD) |
|
#if defined (__STL_USE_NAMESPACES) |
|
#define __JM_STD __STD |
|
#else |
|
#define __JM_STD |
|
#endif |
|
#endif |
|
#ifndef __JM_STDC |
|
#define __JM_STDC |
|
#endif |
|
#ifdef __STL_NO_BOOL |
|
#define JM_NO_BOOL |
|
#endif |
|
#ifdef __STL_LIMITED_DEFAULT_TEMPLATES |
|
#define JM_NO_TRICKY_DEFAULT_PARAM |
|
#define JM_NO_STRING_DEF_ARGS |
|
#endif |
|
#ifndef __STL_USE_EXCEPTIONS |
|
#define JM_NO_EXCEPTIONS |
|
#endif |
|
|
|
#include <algo.h> |
|
#include <alloc.h> |
|
|
|
#define JM_ALGO_INCLUDED |
|
|
|
#define JM_DISTANCE(i, j, n) __JM_STD::distance(i, j, n) |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::output_iterator |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::input_iterator<T, D> |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::forward_iterator<T, D> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::bidirectional_iterator<T, D> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::random_access_iterator<T, D> |
|
|
|
#ifdef __STL_USE_STD_ALLOCATORS |
|
|
|
/* new style allocator's with nested template classes */ |
|
|
|
#define REBIND_INSTANCE(x, y, inst) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other(inst) |
|
#define REBIND_TYPE(x, y) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other |
|
#define JM_DEF_ALLOC_PARAM(x) JM_TRICKY_DEFAULT_PARAM( __JM_STD::allocator<x> ) |
|
#define JM_DEF_ALLOC(x) __JM_STD::allocator<x> |
|
|
|
#else /* __STL_USE_STD_ALLOCATORS */ |
|
|
|
/* old style byte allocator's, no nested templates */ |
|
#define JM_OLD_ALLOCATORS |
|
#define REBIND_INSTANCE(x, y, inst) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y>(inst) |
|
#define REBIND_TYPE(x, y) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y> |
|
#define JM_DEF_ALLOC_PARAM(x) JM_DEFAULT_PARAM( __JM_STD::alloc ) |
|
#define JM_DEF_ALLOC(x) __JM_STD::alloc |
|
#define JM_NEED_BINDER |
|
|
|
#endif /* __STL_USE_STD_ALLOCATORS */ |
|
|
|
#define JM_STL_DONE |
|
#define JM_NO_NOT_EQUAL |
|
|
|
#elif defined(__STD_ITERATOR__) |
|
|
|
/* Rogue Wave STL */ |
|
|
|
#if defined(RWSTD_NO_MEMBER_TEMPLATES) || defined(RWSTD_NO_MEM_CLASS_TEMPLATES) |
|
#define JM_NO_MEMBER_TEMPLATES |
|
#endif |
|
#ifdef _RWSTD_NO_TEMPLATE_ON_RETURN_TYPE |
|
#define JM_NO_TEMPLATE_RETURNS |
|
#endif |
|
|
|
#ifdef _RWSTD_NO_NAMESPACE |
|
#define __JM_STD |
|
#define __JM_STDC |
|
#else |
|
#define __JM_STD std |
|
#endif |
|
|
|
#ifdef RWSTD_NO_EXCEPTIONS |
|
#define JM_NO_EXCEPTIONS |
|
#endif |
|
|
|
#ifdef RWSTD_NO_MUTABLE |
|
#define JM_NO_MUTABLE |
|
#endif |
|
|
|
#ifdef RWSTD_NO_DEFAULT_TEMPLATES |
|
#define JM_NO_DEFAULT_PARAM |
|
#define JM_NO_TRICKY_DEFAULT_PARAM |
|
#define JM_NO_STRING_DEF_ARGS |
|
#endif |
|
|
|
#ifdef _RWSTD_NO_COMPLEX_DEFAULT_TEMPLATES |
|
#define JM_NO_TRICKY_DEFAULT_PARAM |
|
#define JM_NO_STRING_DEF_ARGS |
|
#endif |
|
|
|
#ifdef RWSTD_NO_BOOL |
|
#define JM_NO_BOOL |
|
#endif |
|
|
|
#if _RWSTD_VER > 0x020000 |
|
#ifdef _RWSTD_NO_CLASS_PARTIAL_SPEC |
|
#define JM_DISTANCE(i, j, n) __JM_STD::distance(i, j, n) |
|
#else |
|
#define JM_DISTANCE(i, j, n) (n = __JM_STD::distance(i, j)) |
|
#endif |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::output_iterator_tag, T, D, T*, T&> |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::input_iterator_tag, T, D, T*, T&> |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::forward_iterator_tag, T, D, T*, T&> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::bidirectional_iterator_tag, T, D, T*, T&> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::random_access_iterator_tag, T, D, T*, T&> |
|
#else |
|
#define JM_DISTANCE(i, j, n) __JM_STD::distance(i, j, n) |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::output_iterator |
|
#if _RWSTD_VER >= 0x0200 |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::input_iterator<T> |
|
#else |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::input_iterator<T, D> |
|
#endif |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::forward_iterator<T, D> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::bidirectional_iterator<T, D> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::random_access_iterator<T, D> |
|
#endif |
|
|
|
#include <memory> |
|
|
|
#ifdef _RWSTD_ALLOCATOR |
|
|
|
/* new style allocator */ |
|
|
|
#define REBIND_INSTANCE(x, y, inst) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other(inst) |
|
#define REBIND_TYPE(x, y) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other |
|
#define JM_DEF_ALLOC_PARAM(x) JM_TRICKY_DEFAULT_PARAM( __JM_STD::allocator<x> ) |
|
#define JM_DEF_ALLOC(x) __JM_STD::allocator<x> |
|
|
|
#else |
|
/* |
|
// old style allocator |
|
// this varies a great deal between versions, and there is no way |
|
// that I can tell of differentiating between them, so use our |
|
// own default allocator... |
|
*/ |
|
#define JM_OLD_ALLOCATORS |
|
#define REBIND_INSTANCE(x, y, inst) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y>(inst) |
|
#define REBIND_TYPE(x, y) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y> |
|
#define JM_DEF_ALLOC_PARAM(x) JM_DEFAULT_PARAM( jm_def_alloc ) |
|
#define JM_DEF_ALLOC(x) jm_def_alloc |
|
|
|
#define JM_NEED_BINDER |
|
#define JM_NEED_ALLOC |
|
|
|
#endif |
|
|
|
#define JM_STL_DONE |
|
#define JM_NO_OI_ASSIGN |
|
|
|
#elif defined (ITERATOR_H) |
|
|
|
/* HP STL */ |
|
|
|
#define __JM_STD |
|
#define __JM_STDC |
|
#define JM_NO_LOCALE_H |
|
|
|
#include <algo.h> |
|
#define JM_ALGO_INCLUDED |
|
|
|
#define JM_DISTANCE(i, j, n) __JM_STD::distance(i, j, n) |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::output_iterator |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::input_iterator<T, D> |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::forward_iterator<T, D> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::bidirectional_iterator<T, D> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::random_access_iterator<T, D> |
|
|
|
/* old style allocator */ |
|
#define JM_OLD_ALLOCATORS |
|
#define REBIND_INSTANCE(x, y, inst) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y>(inst) |
|
#define REBIND_TYPE(x, y) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y> |
|
#define JM_DEF_ALLOC_PARAM(x) JM_DEFAULT_PARAM( jm_def_alloc ) |
|
#define JM_DEF_ALLOC(x) jm_def_alloc |
|
|
|
#define JM_NEED_BINDER |
|
#define JM_NEED_ALLOC |
|
#define JM_NO_NOT_EQUAL |
|
|
|
#define JM_STL_DONE |
|
|
|
#elif defined (_MSC_VER) |
|
|
|
/* assume we're using MS's own STL (VC++ 5/6) */ |
|
#define __JM_STD std |
|
#define __JM_STDC |
|
#define JM_NO_OI_ASSIGN |
|
|
|
#define JM_DISTANCE(i, j, n) n = __JM_STD::distance(i, j) |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::output_iterator_tag, T, D> |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::input_iterator_tag, T, D> |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::forward_iterator_tag, T, D> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::bidirectional_iterator_tag, T, D> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::random_access_iterator_tag, T, D> |
|
|
|
/* MS's allocators are rather ambiguous about their properties |
|
at least as far as MSDN is concerned, so play safe: */ |
|
#define JM_OLD_ALLOCATORS |
|
#define REBIND_INSTANCE(x, y, inst) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y>(inst) |
|
#define REBIND_TYPE(x, y) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y> |
|
#define JM_DEF_ALLOC_PARAM(x) JM_DEFAULT_PARAM( jm_def_alloc ) |
|
#define JM_DEF_ALLOC(x) jm_def_alloc |
|
|
|
#define JM_NEED_BINDER |
|
#define JM_NEED_ALLOC |
|
|
|
#define JM_STL_DONE |
|
|
|
#define JM_USE_FACET(l, type) __JM_STD::use_facet(l, (type*)0, true) |
|
#define JM_HAS_FACET(l, type) __JM_STD::has_facet(l, (type*)0) |
|
|
|
|
|
|
|
#else |
|
|
|
/* unknown STL version |
|
try the defaults: */ |
|
|
|
#define JM_DISTANCE(i, j, n) __JM_STD::distance(i, j, n) |
|
/* these may be suspect for older libraries */ |
|
#define JM_OUTPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::output_iterator_tag, T, D, T*, T&> |
|
#define JM_INPUT_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::input_iterator_tag, T, D, T*, T&> |
|
#define JM_FWD_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::forward_iterator_tag, T, D, T*, T&> |
|
#define JM_BIDI_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::bidirectional_iterator_tag, T, D, T*, T&> |
|
#define JM_RA_ITERATOR(T, D) __JM_STD::iterator<__JM_STD::random_access_iterator_tag, T, D, T*, T&> |
|
|
|
#endif /* <iterator> config */ |
|
|
|
#else /* no <iterator> at all */ |
|
|
|
#define JM_DISTANCE(i, j, n) (n = j - i) |
|
#define JM_OUTPUT_ITERATOR(T, D) dummy_iterator_base<T> |
|
#define JM_INPUT_ITERATOR(T, D) dummy_iterator_base<T> |
|
#define JM_FWD_ITERATOR(T, D) dummy_iterator_base<T> |
|
#define JM_BIDI_ITERATOR(T, D) dummy_iterator_base<T> |
|
#define JM_RA_ITERATOR(T, D) dummy_iterator_base<T> |
|
|
|
|
|
#endif |
|
|
|
/* now do allocator if not already done */ |
|
|
|
#ifndef JM_STL_DONE |
|
|
|
#ifdef JM_NO_MEMORY_H |
|
|
|
/* old style allocator */ |
|
|
|
#define JM_OLD_ALLOCATORS |
|
|
|
#define REBIND_INSTANCE(x, y, inst) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y>(inst) |
|
#define REBIND_TYPE(x, y) JM_MAYBE_ACCESS_SPEC re_alloc_binder<x, y> |
|
#define JM_DEF_ALLOC_PARAM(x) JM_DEFAULT_PARAM( jm_def_alloc ) |
|
#define JM_DEF_ALLOC(x) jm_def_alloc |
|
|
|
#define JM_NEED_BINDER |
|
#define JM_NEED_ALLOC |
|
|
|
#else |
|
|
|
/* new style allocator's with nested template classes */ |
|
|
|
#define REBIND_INSTANCE(x, y, inst) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other(inst) |
|
#define REBIND_TYPE(x, y) y::JM_NESTED_TEMPLATE_DECL rebind<x>::other |
|
#define JM_DEF_ALLOC_PARAM(x) JM_TRICKY_DEFAULT_PARAM( __JM_STD::allocator<x> ) |
|
#define JM_DEF_ALLOC(x) __JM_STD::allocator<x> |
|
|
|
#endif |
|
|
|
#endif |
|
#endif // JM_AUTO_CONFIGURE |
|
|
|
|
|
|
|
/* namespace configuration goes here: */ |
|
#ifdef JM_NO_NAMESPACES |
|
|
|
#ifdef __JM_STD |
|
#undef __JM_STD |
|
#endif |
|
|
|
#ifdef __JM_STDC |
|
#undef __JM_STDC |
|
#endif |
|
|
|
#ifdef __JM |
|
#undef __JM |
|
#endif |
|
|
|
#define __JM |
|
#define __JM_STD |
|
#define __JM_STDC |
|
#define JM_NAMESPACE(x) |
|
#define JM_END_NAMESPACE |
|
#define JM_USING(x) |
|
|
|
#else |
|
|
|
#ifndef __JM_STD |
|
#define __JM_STD std |
|
#endif |
|
|
|
#ifndef __JM_STDC |
|
#define __JM_STDC std |
|
#endif |
|
|
|
#ifndef __JM |
|
#define __JM jm |
|
#endif |
|
|
|
#define JM_NAMESPACE(x) namespace x{ |
|
#define JM_END_NAMESPACE }; |
|
#define JM_USING(x) using namespace x; |
|
|
|
#endif |
|
|
|
/* locale configuration goes here */ |
|
#if !defined(JM_NO_LOCALE_H) && defined(RE_LOCALE_CPP) |
|
#include <locale> |
|
#define LOCALE_INSTANCE(i) __JM_STD::locale i; |
|
#define MAYBE_PASS_LOCALE(i) , i |
|
#ifndef JM_NO_TEMPLATE_RETURNS |
|
#ifndef JM_USE_FACET |
|
#define JM_USE_FACET(l, type) __JM_STD::use_facet< type >(l) |
|
#endif |
|
#ifndef JM_HAS_FACET |
|
#define JM_HAS_FACET(l, type) __JM_STD::has_facet< type >(l) |
|
#endif |
|
#else |
|
#ifndef JM_USE_FACET |
|
#define JM_USE_FACET(l, type) __JM_STD::use_facet(l, (type*)0) |
|
#endif |
|
#ifndef JM_HAS_FACET |
|
#define JM_HAS_FACET(l, type) __JM_STD::has_facet(l, (type*)0) |
|
#endif |
|
#endif |
|
#else |
|
#define LOCALE_INSTANCE(i) |
|
#define MAYBE_PASS_LOCALE(i) |
|
#endif |
|
|
|
/* compiler configuration goes here: */ |
|
|
|
#ifdef JM_NO_MUTABLE |
|
#define JM_MUTABLE |
|
#else |
|
#define JM_MUTABLE mutable |
|
#endif |
|
|
|
#if defined( JM_NO_BOOL) && !defined(bool) |
|
#define bool int |
|
#define true 1 |
|
#define false 0 |
|
#endif |
|
|
|
#ifndef RE_CALL |
|
#define RE_CALL |
|
#endif |
|
|
|
#ifndef RE_CCALL |
|
#define RE_CCALL |
|
#endif |
|
|
|
#ifndef RE_DECL |
|
#define RE_DECL |
|
#endif |
|
|
|
#if defined(JM_NO_DEFAULT_PARAM) || defined(JM_NO_TRICKY_DEFAULT_PARAM) |
|
#define JM_NO_STRING_DEF_ARGS |
|
#endif |
|
|
|
|
|
|
|
/* add our class def's if they are needed: */ |
|
|
|
JM_NAMESPACE(__JM) |
|
|
|
// add our destroy functions: |
|
|
|
template <class T> |
|
inline void RE_CALL jm_destroy(T* t) |
|
{ |
|
t->~T(); |
|
} |
|
|
|
inline void RE_CALL jm_destroy(char* t){} |
|
inline void RE_CALL jm_destroy(short* t){} |
|
inline void RE_CALL jm_destroy(unsigned short* t){} |
|
inline void RE_CALL jm_destroy(int* t){} |
|
inline void RE_CALL jm_destroy(unsigned int* t){} |
|
inline void RE_CALL jm_destroy(long* t){} |
|
inline void RE_CALL jm_destroy(unsigned long* t){} |
|
|
|
|
|
template <class T> |
|
inline void RE_CALL jm_construct(void* p, const T& t) |
|
{ |
|
new (p) T(t); |
|
} |
|
|
|
|
|
template<class T, class Allocator> |
|
class re_alloc_binder : public Allocator |
|
{ |
|
public: |
|
typedef T value_type; |
|
typedef T* pointer; |
|
typedef const T* const_pointer; |
|
typedef T& reference; |
|
typedef const T& const_reference; |
|
typedef size_t size_type; |
|
typedef __JM_STDC::ptrdiff_t difference_type; |
|
|
|
re_alloc_binder(const Allocator& i); |
|
re_alloc_binder(const re_alloc_binder& o) : Allocator(o) {} |
|
|
|
T* RE_CALL allocate(size_t n, size_t /* hint */ = 0) |
|
{ return 0 == n ? 0 : (T*) this->Allocator::allocate(n * sizeof(T)); } |
|
void RE_CALL deallocate(T *p, size_t n) |
|
{ if (0 != n) this->Allocator::deallocate((char*)p, n * sizeof (T)); } |
|
|
|
pointer RE_CALL address(reference x) const { return &x; } |
|
const_pointer RE_CALL address(const_reference x) const { return &x; } |
|
static size_type RE_CALL max_size() { return -1; } |
|
static void RE_CALL construct(pointer p, const T& val) { jm_construct(p, val); } |
|
void RE_CALL destroy(pointer p) { jm_destroy(p); } |
|
|
|
const Allocator& RE_CALL instance()const { return *this; } |
|
|
|
#ifndef JM_NO_MEMBER_TEMPLATES |
|
|
|
template <class U> |
|
struct rebind |
|
{ |
|
typedef re_alloc_binder<U, Allocator> other; |
|
}; |
|
|
|
template <class U> |
|
RE_CALL re_alloc_binder(const re_alloc_binder<U, Allocator>& o) throw() |
|
: Allocator(o.instance()) |
|
{ |
|
} |
|
#endif |
|
}; |
|
|
|
template<class T, class Allocator> |
|
inline re_alloc_binder<T, Allocator>::re_alloc_binder(const Allocator &i) |
|
: Allocator(i) |
|
{} |
|
|
|
|
|
// |
|
// class jm_def_alloc |
|
// basically a standard allocator that only allocates bytes... |
|
// think of it as allocator<char>, with a non-standard |
|
// rebind::other typedef. |
|
// |
|
class jm_def_alloc |
|
{ |
|
public: |
|
typedef char value_type; |
|
typedef char* pointer; |
|
typedef const char* const_pointer; |
|
typedef char& reference; |
|
typedef const char& const_reference; |
|
typedef size_t size_type; |
|
typedef __JM_STDC::ptrdiff_t difference_type; |
|
|
|
pointer RE_CALL address(reference x) const { return &x; } |
|
const_pointer RE_CALL address(const_reference x) const { return &x; } |
|
static size_type RE_CALL max_size() { return (size_type)-1; } |
|
static void RE_CALL construct(pointer , const char& ) { } |
|
void RE_CALL destroy(pointer ) { } |
|
static void * RE_CALL allocate(size_t n, size_t /* hint */ = 0) |
|
{ |
|
return ::operator new(n); |
|
} |
|
static void RE_CALL deallocate(void *p, size_t /*n*/ ) |
|
{ |
|
::operator delete(p); |
|
} |
|
|
|
#ifndef JM_NO_MEMBER_TEMPLATES |
|
template <class U> |
|
struct rebind |
|
{ |
|
typedef re_alloc_binder<U, jm_def_alloc> other; |
|
}; |
|
|
|
template <class U> |
|
RE_CALL jm_def_alloc(const re_alloc_binder<U, jm_def_alloc>& ) throw() { } |
|
#endif |
|
jm_def_alloc(const jm_def_alloc&) {} |
|
jm_def_alloc() {} |
|
}; |
|
|
|
template <class T> |
|
struct dummy_iterator_base |
|
{ |
|
typedef T value_type; |
|
typedef __JM_STDC::ptrdiff_t difference_type; |
|
typedef T* pointer; |
|
typedef T& reference; |
|
//typedef Category iterator_category; |
|
}; |
|
|
|
// we need to absolutely sure that int values are correctly |
|
// translated to bool (true or false) values... |
|
// note that the original HP STL redefines the bool type regardless |
|
// of whether the compiler supports it.... yuk |
|
|
|
#if defined(JM_NO_BOOL) || defined(ITERATOR_H) || defined(bool) |
|
#define JM_MAKE_BOOL(x) boolify(x) |
|
|
|
template <class I> |
|
inline bool RE_CALL boolify(I val) |
|
{ |
|
return val ? true : false; |
|
} |
|
|
|
#else |
|
#define JM_MAKE_BOOL(x) x |
|
#endif |
|
|
|
// class auto_array: |
|
// |
|
// encapsulates objects allocated with ::operator new[]() |
|
// interface the same as auto_ptr, but no stream operators |
|
// since we don't know how big the array is. |
|
// |
|
// Usage: auto_array<char> buf = new char[256]; |
|
// |
|
|
|
template<class X> |
|
class auto_array |
|
{ |
|
public: // construct/copy/destroy: |
|
|
|
auto_array(X* p =0) |
|
{ ptr = p; } |
|
|
|
auto_array(const auto_array& ap) |
|
{ ptr = const_cast<auto_array&>(ap).release(); } |
|
|
|
void RE_CALL operator=(const auto_array&); |
|
|
|
~auto_array(); |
|
|
|
// members: |
|
|
|
X& RE_CALL operator*() const; |
|
X* RE_CALL operator->() const; |
|
X* RE_CALL get() const; |
|
X& RE_CALL operator[](int i); |
|
X* RE_CALL release(); |
|
|
|
// operator not part of the spec: |
|
RE_CALL operator X*()const |
|
{ return ptr; } |
|
|
|
private: // data: |
|
|
|
X* ptr; |
|
}; |
|
|
|
template <class X> |
|
inline void RE_CALL auto_array<X>::operator=(const auto_array<X>& ap) |
|
{ |
|
delete[] ptr; |
|
ptr = const_cast<auto_array<X>&>(ap).release(); |
|
} |
|
|
|
template <class X> |
|
inline auto_array<X>::~auto_array() |
|
{ |
|
delete[] ptr; |
|
} |
|
|
|
template <class X> |
|
inline X& RE_CALL auto_array<X>::operator*() const |
|
{ |
|
return *ptr; |
|
} |
|
|
|
template <class X> |
|
inline X* RE_CALL auto_array<X>::operator->() const |
|
{ |
|
return ptr; |
|
} |
|
|
|
template <class X> |
|
inline X* RE_CALL auto_array<X>::get() const |
|
{ |
|
return ptr; |
|
} |
|
|
|
template <class X> |
|
inline X& RE_CALL auto_array<X>::operator[](int i) |
|
{ |
|
return ptr[i]; |
|
} |
|
|
|
template <class X> |
|
inline X* RE_CALL auto_array<X>::release() |
|
{ |
|
X* tmp = ptr; |
|
ptr = NULL; |
|
return tmp; |
|
} |
|
|
|
|
|
JM_END_NAMESPACE |
|
|
|
#if !defined(INLINE_EXCEPTION_BUG) || defined(JM_NO_TEMPLATE_MERGE) |
|
#define CONSTRUCTOR_INLINE inline |
|
#else |
|
#define CONSTRUCTOR_INLINE |
|
#endif |
|
|
|
#if defined(JM_PLATFORM_W32) && !defined(RE_LOCALE_W32) && !defined(RE_LOCALE_C) && !defined(RE_LOCALE_CPP) && !defined(JM_NO_W32) |
|
#define RE_LOCALE_W32 |
|
#endif |
|
|
|
#if !defined(RE_LOCALE_W32) && !defined(RE_LOCALE_C) && !defined(RE_LOCALE_CPP) |
|
#define RE_LOCALE_C |
|
#endif |
|
|
|
#if defined(JM_OLD_ALLOCATORS) && defined(JM_NO_TEMPLATE_TYPENAME) |
|
#define JM_MAYBE_TYPENAME |
|
#else |
|
#define JM_MAYBE_TYPENAME typename |
|
#endif |
|
|
|
#ifdef RE_LOCALE_W32 |
|
#include <windows.h> |
|
#endif |
|
|
|
|
|
/* now do debugging stuff: */ |
|
|
|
#ifdef JM_DEBUG |
|
|
|
#ifdef OLD_IOSTREAM |
|
#include <iostream.h> |
|
#else |
|
#include <iostream> |
|
using std::cout; |
|
using std::cin; |
|
using std::cerr; |
|
#endif |
|
|
|
#ifndef jm_assert |
|
#define jm_assert(x) if((x) == 0){ cerr << "Assertion failed: " << #x << " in file " << __FILE__ << "and line " << __LINE__ << endl; exit(-1); } |
|
#endif |
|
#ifndef jm_trace |
|
#define jm_trace(x) cerr << x; |
|
#endif |
|
|
|
#ifdef __BORLANDC__ |
|
#pragma message "macro __jm_std: " __JM_STD |
|
#pragma message "macro __jm_stdc: " __JM_STDC |
|
#pragma message "macro namespace: " JM_NAMESPACE(__JM_STD) |
|
#pragma message "macro allocator: " JM_DEF_ALLOC_PARAM(wchar_t) |
|
#pragma message "macro jm_input_iterator: " JM_INPUT_ITERATOR(char, __JM_STDC::ptrdiff_t) |
|
#pragma message "macro jm_output_iterator: " JM_OUTPUT_ITERATOR(char, __JM_STDC::ptrdiff_t) |
|
#pragma message "macro jm_fwd_iterator: " JM_FWD_ITERATOR(char, __JM_STDC::ptrdiff_t) |
|
#pragma message "macro jm_bidi_iterator: " JM_BIDI_ITERATOR(char, __JM_STDC::ptrdiff_t) |
|
#pragma message "macro jm_ra_iterator: " JM_RA_ITERATOR(char, __JM_STDC::ptrdiff_t) |
|
#ifdef RE_LOCALE_CPP |
|
#pragma message "locale support enabled" |
|
#endif |
|
#endif |
|
|
|
#else |
|
|
|
#define jm_assert(x) |
|
#define jm_trace(x) |
|
|
|
#endif |
|
|
|
#endif /* __cplusplus */ |
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|