| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program is distributed in the hope that it will be useful,
- ** but WITHOUT ANY WARRANTY; without even the implied warranty of
- ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- ** GNU General Public License for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- /***********************************************************************************************
- *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
- ***********************************************************************************************
- * *
- * Project Name : Command & Conquer *
- * *
- * $Archive:: /Commando/Code/wwlib/always.h $*
- * *
- * $Author:: Steve_t $*
- * *
- * $Modtime:: 8/28/01 3:21p $*
- * *
- * $Revision:: 13 $*
- * *
- *---------------------------------------------------------------------------------------------*
- * Functions: *
- * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
- #if _MSC_VER >= 1000
- #pragma once
- #endif // _MSC_VER >= 1000
- #ifndef ALWAYS_H
- #define ALWAYS_H
- // Disable warning about exception handling not being enabled. It's used as part of STL - in a part of STL we don't use.
- #pragma warning(disable : 4530)
- /*
- ** Define for debug memory allocation to include __FILE__ and __LINE__ for every memory allocation.
- ** This helps find leaks.
- */
- //#define STEVES_NEW_CATCHER
- #ifdef _DEBUG
- #ifdef _MSC_VER
- #ifdef STEVES_NEW_CATCHER
- #include <crtdbg.h>
- #include <stdlib.h>
- #include <malloc.h>
- #define malloc(s) _malloc_dbg(s, _NORMAL_BLOCK, __FILE__, __LINE__)
- #define calloc(c, s) _calloc_dbg(c, s, _NORMAL_BLOCK, __FILE__, __LINE__)
- #define realloc(p, s) _realloc_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
- #define _expand(p, s) _expand_dbg(p, s, _NORMAL_BLOCK, __FILE__, __LINE__)
- #define free(p) _free_dbg(p, _NORMAL_BLOCK)
- #define _msize(p) _msize_dbg(p, _NORMAL_BLOCK)
- void* __cdecl operator new(unsigned int s);
- #endif //STEVES_NEW_CATCHER
- #endif //_MSC_VER
- #endif //_DEBUG
- // Jani: Intel's C++ compiler issues too many warnings in WW libraries when using warning level 4
- #if defined (__ICL) // Detect Intel compiler
- #pragma warning (3)
- #pragma warning ( disable: 981 ) // parameters defined in unspecified order
- #pragma warning ( disable: 279 ) // controlling expressaion is constant
- #pragma warning ( disable: 271 ) // trailing comma is nonstandard
- #pragma warning ( disable: 171 ) // invalid type conversion
- #pragma warning ( disable: 1 ) // last line of file ends without a newline
- #endif
- // Jani: MSVC doesn't necessarily inline code with inline keyword. Using __forceinline results better inlining
- // and also prints out a warning if inlining wasn't possible. __forceinline is MSVC specific.
- #if defined(_MSC_VER)
- #define WWINLINE __forceinline
- #else
- #define WWINLINE inline
- #endif
- /*
- ** Define the MIN and MAX macros.
- ** NOTE: Joe used to #include <minmax.h> in the various compiler header files. This
- ** header defines 'min' and 'max' macros which conflict with the surrender code so
- ** I'm relpacing all occurances of 'min' and 'max with 'MIN' and 'MAX'. For code which
- ** is out of our domain (e.g. Max sdk) I'm declaring template functions for 'min' and 'max'
- */
- #define NOMINMAX
- #ifndef MAX
- #define MAX(a,b) (((a) > (b)) ? (a) : (b))
- #endif
- #ifndef MIN
- #define MIN(a,b) (((a) < (b)) ? (a) : (b))
- #endif
- #ifdef min
- #undef min
- #endif
- #ifdef max
- #undef max
- #endif
- template <class T> T min(T a,T b)
- {
- if (a<b) {
- return a;
- } else {
- return b;
- }
- }
- template <class T> T max(T a,T b)
- {
- if (a>b) {
- return a;
- } else {
- return b;
- }
- }
- /*
- ** This includes the minimum set of compiler defines and pragmas in order to bring the
- ** various compilers to a common behavior such that the C&C engine will compile without
- ** error or warning.
- */
- #if defined(__BORLANDC__)
- #include "borlandc.h"
- #endif
- #if defined(_MSC_VER)
- #include "visualc.h"
- #endif
- #if defined(__WATCOMC__)
- #include "watcom.h"
- #endif
- #ifndef NULL
- #define NULL 0
- #endif
- /**********************************************************************
- ** This macro serves as a general way to determine the number of elements
- ** within an array.
- */
- #ifndef ARRAY_SIZE
- #define ARRAY_SIZE(x) int(sizeof(x)/sizeof(x[0]))
- #endif
- #ifndef size_of
- #define size_of(typ,id) sizeof(((typ*)0)->id)
- #endif
- #endif
|