/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ #ifndef __CAST_H #define __CAST_H // To handle casts between the various windows // platforms. // We use these macros/inline functions instead of just // casting directly so that we can manipulate their // behaviour on a broad scale, and very customized // behaviour can be achieved if you need to range // check values in debug mode, etc. // PAY ATTENTION, OR WE'RE ALL DEAD: // The use of inline functions is to avoid the over evaluation // problem (common to macros) when repeating parameters // in doing a computation. // i.e. // #define EVAL(a) ((a) + (a)) // // EVAL(a *= a + a); // However, by using inline function, it is not possible // to provide every possible cast operation that macros // do cover. This is a known shortfall. Templates were // the solution, but it's not clear that we'll ever have // a 16 bit compiler which supports templates. You will // have to implement each needed cast seperately. You // can mostly avoid the problem by using the largest possible // data type. // To turn off all casting in the front end which // utilizes these macros, define NO_CAST, and get // ready for a boatload of warnings. //#define NO_CAST // Now onto the show. // GAB 09-13-95 // Native integer cast, good for use in WinAPI calls. // In debug, we camp on you if we actually lose bits, as it // is ambiguous if we should hold the top limit to MAXINT // or if we should just take the lower sizeof(int) bytes // and ignore the rest. #ifndef NO_CAST #ifndef _DEBUG #define CASTINT(a) ((int)(a)) #else inline int CASTINT(long a) { int b = (int)a; ASSERT(a == (long)b); return(b); } #endif #else #define CASTINT(a) (a) #endif // Native unsigned cast. // In debug, we camp on you if we actually lose bits. #ifndef NO_CAST #ifndef _DEBUG #define CASTUINT(a) ((unsigned)(a)) #else inline unsigned CASTUINT(long a) { unsigned b = (unsigned)a; ASSERT(a == (long)b); return(b); } #endif #else #define CASTUINT(a) (a) #endif #ifndef NO_CAST #ifndef _DEBUG #define CASTSIZE_T(a) ((size_t)(a)) #else inline size_t CASTSIZE_T(long a) { size_t b = (size_t)a; ASSERT(a == (long)b); return(b); } #endif #else #define CASTSIZE_T(a) (a) #endif #ifndef NO_CAST #ifndef _DEBUG #define CASTDWORD(a) ((DWORD)(a)) #else inline DWORD CASTDWORD(long a) { DWORD b = (DWORD)a; ASSERT(a == (long)b); return(b); } #endif #else #define CASTDWORD(a) (a) #endif // NCAPI data from URL_Struct #define NCAPIDATA(pUrl) ((CNcapiUrlData *)(pUrl)->ncapi_data) // Context casts #define CX2VOID(pContext, CastFromClassCX) ((void *)((CAbstractCX *)((CastFromClassCX *)(pContext)))) #define VOID2CX(pVoid, CastToClassCX) ((CastToClassCX *)((CAbstractCX *)((void *)(pVoid)))) #define ABSTRACTCX(pXPCX) ((pXPCX)->fe.cx) #define BOOKMARKCX(pXPCX) ((CNewBookmarkWnd *)((pXPCX)->fe.cx)) #define WINCX(pXPCX) ((CWinCX *)((pXPCX)->fe.cx)) #define CXDC(pXPCX) ((CDCCX *)((pXPCX)->fe.cx)) #define PANECX(pXPCX) ((CPaneCX *)((pXPCX)->fe.cx)) #endif // __CAST_H