From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 5954 invoked by alias); 26 Jun 2004 16:52:47 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 5486 invoked from network); 26 Jun 2004 16:52:43 -0000 Received: from unknown (HELO develer.com) (151.38.19.110) by sourceware.org with SMTP; 26 Jun 2004 16:52:43 -0000 Received: (qmail 17292 invoked from network); 26 Jun 2004 16:51:56 -0000 Received: from beetle.trilan (HELO ?10.3.2.254?) (?w6OqjkQWkYcwaeQBilRcvXCGrY/Z3b6o?@10.3.2.254) by trinity.trilan with SMTP; 26 Jun 2004 16:51:56 -0000 Message-ID: <40DDA9AB.7010603@develer.com> Date: Sat, 26 Jun 2004 16:52:00 -0000 From: Bernardo Innocenti Organization: Develer S.r.l. User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7) Gecko/20040622 MIME-Version: 1.0 To: Falk Hueffner CC: Zack Weinberg , Alexandre Oliva , Ian Lance Taylor , GCC Patches , gdb-patches@sources.redhat.com, binutils@sources.redhat.com, DJ Delorie Subject: Re: [top-level] C++-friendly allocators for libiberty References: <40DCC86A.4010306@develer.com> <40DCD0EE.9010208@develer.com> <40DCE1C8.4020202@develer.com> <87wu1u7w8w.fsf@taltos.codesourcery.com> <87wu1uo9cy.fsf@informatik.uni-tuebingen.de> In-Reply-To: <87wu1uo9cy.fsf@informatik.uni-tuebingen.de> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2004-06/txt/msg00568.txt.bz2 Falk Hueffner wrote: > Zack Weinberg writes: > > >>Alexandre Oliva writes: >> >> >>>>+#define xcnewvec(T, N) (T *) xcalloc (N, sizeof (T)) >>>>+#define xresize(T, P, S) (T *) xrealloc (P, S) >>>>+#define xresizevec(T, P, N) (T *) xrealloc (P, sizeof (T) * (N)) >>>>+#define xobnew(O, T) (T *) obstack_alloc (O, sizeof (T)) >>> >>>You're missing parentheses around N, P (twice), S and O. >> >>They're not actually necessary in this context. > > > How about parentheses around the whole cast? Somebody might want to > write > > &xnew(T)->el > > Not very likely, but IMHO it's not really worth the trouble to try to > think of every possible or sensible use instead of just adding a bunch > of parentheses. Agreed. This is the full patch again updated with your suggestions and a proposed fix for the realloc() interface. include/ 2004-06-26 Bernardo Innocenti * include/libiberty.h (xnew, xcnew, xnewvec, xcnewvec, xobnew): Move here from libcpp/internal.h. (xdelete, xresizevec, xdeletevec, xnewvar, xcnewvar, xresizevar): New macros. diff -u -p -r1.35 libiberty.h --- include/libiberty.h 15 May 2003 19:02:12 -0000 1.35 +++ include/libiberty.h 26 Jun 2004 16:35:34 -0000 @@ -250,6 +250,37 @@ extern PTR xmemdup PARAMS ((const PTR, s extern double physmem_total PARAMS ((void)); extern double physmem_available PARAMS ((void)); + +/* These macros provide a K&R/C89/C++-friendly way of allocating structures + with nice encapsulation. The xdelete*() macros are technically + superfluous, but provided here for symmetry. Using them consistently + makes it easier to update client code to use different allocators such + as new/delete and new[]/delete[]. */ + +/* Scalar allocators. */ + +#define xnew(T) ((T *) xmalloc (sizeof (T))) +#define xcnew(T) ((T *) xcalloc (1, sizeof (T))) +#define xdelete(P) free (P) + +/* Array allocators. */ + +#define xnewvec(T, N) ((T *) xmalloc (sizeof (T) * (N))) +#define xcnewvec(T, N) ((T *) xcalloc (N, sizeof (T))) +#define xresizevec(T, P, N) ((T *) xrealloc (P, sizeof (T) * (N))) +#define xdeletevec(P) free (P) + +/* Allocators for variable-sized structures and raw buffers. */ + +#define xnewvar(T, S) ((T *) xmalloc (S)) +#define xcnewvar(T, S) ((T *) xcalloc (1, S)) +#define xresizevar(T, P, S) ((T *) xrealloc (P, S)) + +/* Type-safe obstack allocator. */ + +#define xobnew(O, T) ((T *) obstack_alloc (O, sizeof (T))) + + /* hex character manipulation routines */ #define _hex_array_size 256 -- // Bernardo Innocenti - Develer S.r.l., R&D dept. \X/ http://www.develer.com/