# HG changeset patch # User Jaroslav Hajek # Date 1268818236 -3600 # Node ID afe44ee90cbd9e635b3425525a689cea56a1987a # Parent 6c19d6fcd7e551593e44fbe0d2c9cbca5f31db2f implement generic macro magic for repeated decls diff -r 6c19d6fcd7e5 -r afe44ee90cbd liboctave/ChangeLog --- a/liboctave/ChangeLog Wed Mar 17 08:46:46 2010 +0100 +++ b/liboctave/ChangeLog Wed Mar 17 10:30:36 2010 +0100 @@ -1,3 +1,9 @@ +2010-03-17 Jaroslav Hajek + + * lo-macros.h: New source. + * dim-vector.h: Use the macro magic to define constructors + generically. + 2010-03-17 Jaroslav Hajek * dim-vector.h: Provide constructors up to order 7. diff -r 6c19d6fcd7e5 -r afe44ee90cbd liboctave/Makefile.am --- a/liboctave/Makefile.am Wed Mar 17 08:46:46 2010 +0100 +++ b/liboctave/Makefile.am Wed Mar 17 10:30:36 2010 +0100 @@ -202,6 +202,7 @@ idx-vector.h \ kpse-xfns.h \ lo-ieee.h \ + lo-macros.h \ lo-mappers.h \ lo-math.h \ lo-specfun.h \ diff -r 6c19d6fcd7e5 -r afe44ee90cbd liboctave/dim-vector.h --- a/liboctave/dim-vector.h Wed Mar 17 08:46:46 2010 +0100 +++ b/liboctave/dim-vector.h Wed Mar 17 10:30:36 2010 +0100 @@ -31,6 +31,7 @@ #include #include "lo-error.h" +#include "lo-macros.h" // Rationale: This implementation is more tricky than Array, but the // big plus is that dim_vector requires only one allocation instead of @@ -154,54 +155,24 @@ rep[1] = c; rep[2] = p; } - - dim_vector (octave_idx_type r, octave_idx_type c, octave_idx_type p, - octave_idx_type q) - : rep (newrep (4)) - { - rep[0] = r; - rep[1] = c; - rep[2] = p; - rep[3] = q; - } - - dim_vector (octave_idx_type r, octave_idx_type c, octave_idx_type p, - octave_idx_type q, octave_idx_type s) - : rep (newrep (5)) - { - rep[0] = r; - rep[1] = c; - rep[2] = p; - rep[3] = q; - rep[4] = s; + +#define ASSIGN_REP(i) rep[i] = d ## i; +#define DIM_VECTOR_CTOR(N) \ + dim_vector (OCT_MAKE_DECL_LIST(octave_idx_type, d, N)) \ + : rep (newrep (N)) \ + { \ + OCT_ITERATE_MACRO(ASSIGN_REP, N) \ } - - dim_vector (octave_idx_type r, octave_idx_type c, octave_idx_type p, - octave_idx_type q, octave_idx_type s, octave_idx_type t) - : rep (newrep (6)) - { - rep[0] = r; - rep[1] = c; - rep[2] = p; - rep[3] = q; - rep[4] = s; - rep[5] = t; - } - - dim_vector (octave_idx_type r, octave_idx_type c, octave_idx_type p, - octave_idx_type q, octave_idx_type s, octave_idx_type t, - octave_idx_type u) - : rep (newrep (7)) - { - rep[0] = r; - rep[1] = c; - rep[2] = p; - rep[3] = q; - rep[4] = s; - rep[5] = t; - rep[6] = u; - } - + + // Add more if needed. + DIM_VECTOR_CTOR(4) + DIM_VECTOR_CTOR(5) + DIM_VECTOR_CTOR(6) + DIM_VECTOR_CTOR(7) + +#undef ASSIGN_REP +#undef DIM_VECTOR_CTOR + dim_vector (const octave_idx_type *vec, size_t vec_size) : rep (newrep (vec_size)) { diff -r 6c19d6fcd7e5 -r afe44ee90cbd liboctave/lo-macros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/liboctave/lo-macros.h Wed Mar 17 10:30:36 2010 +0100 @@ -0,0 +1,95 @@ +/* + +Copyright (C) 2010 VZLU Prague + +This file is part of Octave. + +Octave 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. + +Octave 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 Octave; see the file COPYING. If not, see +. + +*/ + +#if !defined (octave_liboctave_macros_h) +#define octave_liboctave_macros_h 1 + +// Core macros. Iteration is supported up to count 10. + +#define OCT_ITERATE_PARAM_MACRO0(MACRO, PARAM) +#define OCT_ITERATE_PARAM_MACRO1(MACRO, PARAM) \ +MACRO(0, PARAM) +#define OCT_ITERATE_PARAM_MACRO2(MACRO, PARAM) \ +MACRO(0, PARAM) MACRO(1, PARAM) +#define OCT_ITERATE_PARAM_MACRO3(MACRO, PARAM) \ +MACRO(0, PARAM) MACRO(1, PARAM) MACRO(2, PARAM) +#define OCT_ITERATE_PARAM_MACRO4(MACRO, PARAM) \ +MACRO(0, PARAM) MACRO(1, PARAM) MACRO(2, PARAM) MACRO(3, PARAM) +#define OCT_ITERATE_PARAM_MACRO5(MACRO, PARAM) \ +MACRO(0, PARAM) MACRO(1, PARAM) MACRO(2, PARAM) MACRO(3, PARAM) MACRO(4, PARAM) +#define OCT_ITERATE_PARAM_MACRO6(MACRO, PARAM) \ +OCT_ITERATE_PARAM_MACRO5(MACRO, PARAM) MACRO(5, PARAM) +#define OCT_ITERATE_PARAM_MACRO7(MACRO, PARAM) \ +OCT_ITERATE_PARAM_MACRO5(MACRO, PARAM) MACRO(5, PARAM) MACRO(6, PARAM) +#define OCT_ITERATE_PARAM_MACRO8(MACRO, PARAM) \ +OCT_ITERATE_PARAM_MACRO5(MACRO, PARAM) MACRO(5, PARAM) MACRO(6, PARAM) MACRO(7, PARAM) +#define OCT_ITERATE_PARAM_MACRO9(MACRO, PARAM) \ +OCT_ITERATE_PARAM_MACRO8(MACRO, PARAM) MACRO(8, PARAM) +#define OCT_ITERATE_PARAM_MACRO10(MACRO, PARAM) \ +OCT_ITERATE_PARAM_MACRO8(MACRO, PARAM) MACRO(8, PARAM) MACRO(9, PARAM) + +// expands to MACRO(0, PARAM) MACRO(1, PARAM) ... MACRO(NUM-1, PARAM) +#define OCT_ITERATE_PARAM_MACRO(MACRO, PARAM, NUM) OCT_ITERATE_PARAM_MACRO##NUM(MACRO,PARAM) + +#define OCT_IF_PARAM0(MACRO, PARAM) +#define OCT_IF_PARAM1(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM2(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM3(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM4(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM5(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM6(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM7(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM8(MACRO, PARAM) MACRO(PARAM) +#define OCT_IF_PARAM9(MACRO, PARAM) MACRO(PARAM) + +// expands to MACRO(PARAM) if NUM > 0 +#define OCT_IF_PARAM(NUM, MACRO, PARAM) OCT_IF_PARAM##NUM(MACRO, PARAM) + +// concatenation and reverse concat +#define OCT_CONCAT2(ARG1, ARG2) ARG1 ## ARG2 +#define OCT_CONCAT2_REVERSE(ARG1, ARG2) ARG2 ## ARG1 + +#define OCT_IF_HELPER(X) X + +// expands to X if NUM > 0 +#define OCT_IF(NUM, X) OCT_IF_PARAM(NUM, OCT_IF_HELPER, X) + +#define OCT_ITERATE_MACRO_HELPER(NUM, MACRO) MACRO(NUM) + +// expands to MACRO(0) ... MACRO(NUM-1) +#define OCT_ITERATE_MACRO(MACRO, NUM) OCT_ITERATE_PARAM_MACRO(OCT_ITERATE_MACRO_HELPER, MACRO, NUM) + +#define OCT_MAKE_LIST_HELPER1(ARG) ARG, + +// expands to MACRO(0), MACRO(1), ..., MACRO(NUM-1) +#define OCT_MAKE_LIST_HELPER(NUM, MACRO) OCT_IF_PARAM(NUM,OCT_MAKE_LIST_HELPER1,) MACRO(NUM) + +#define OCT_MAKE_LIST(MACRO, NUM) OCT_ITERATE_PARAM_MACRO(OCT_MAKE_LIST_HELPER, MACRO, NUM) + +#define OCT_MAKE_DECL_LIST_HELPER(NUM, PREFIX) \ + OCT_IF_PARAM(NUM,OCT_MAKE_LIST_HELPER1,) OCT_CONCAT2(PREFIX, NUM) + +// expands to TYPE PREFIX0, TYPE PREFIX1, ..., TYPE PREFIX ## (NUM-1) +#define OCT_MAKE_DECL_LIST(TYPE, PREFIX, NUM) \ + OCT_ITERATE_PARAM_MACRO(OCT_MAKE_DECL_LIST_HELPER, TYPE PREFIX, NUM) + +#endif