| /************************************************************************ |
| * |
| * rw_sigdefs.h - definitions of helpers macros to define member and |
| * non-member functions overload id's |
| * |
| * $Id$ |
| * |
| *************************************************************************** |
| * |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed |
| * with this work for additional information regarding copyright |
| * ownership. The ASF licenses this file to you under the Apache |
| * License, Version 2.0 (the "License"); you may not use this file |
| * except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| * implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| * |
| **************************************************************************/ |
| |
| #ifndef RW_SIGDEFS_H_INCLUDED |
| #define RW_SIGDEFS_H_INCLUDED |
| |
| // FCAT() concatenates prefix, underscrore, and suffix |
| #define _FCAT(a, b) a ## b |
| #define FCAT(a, b) _FCAT (a ## _, b) |
| |
| // FID_N() constructs the name for an overload of a container function |
| #define FID_0(f) FCAT (f, void) |
| #define FID_1(f, a) FCAT (f, a) |
| #define FID_2(f, a, b) FID_1 (FCAT (f, a), b) |
| #define FID_3(f, a, b, c) FID_2 (FCAT (f, a), b, c) |
| #define FID_4(f, a, b, c, d) FID_3 (FCAT (f, a), b, c, d) |
| #define FID_5(f, a, b, c, d, e) FID_4 (FCAT (f, a), b, c, d, e) |
| |
| // ARG() creates a bitmap of an argument type at the given position |
| #define ARG(a, N) ((arg_ ## a << (N * arg_bits)) << fid_bits) |
| |
| // SIG_N() creates an argument bitmap for the given function signature |
| #define SIG_0(f) fid_ ## f |
| #define SIG_1(f, a) SIG_0 (f) | ARG (a, 0) |
| #define SIG_2(f, a, b) SIG_1 (f, a) | ARG (b, 1) |
| #define SIG_3(f, a, b, c) SIG_2 (f, a, b) | ARG (c, 2) |
| #define SIG_4(f, a, b, c, d) SIG_3 (f, a, b, c) | ARG (d, 3) |
| #define SIG_5(f, a, b, c, d, e) SIG_4 (f, a, b, c, d) | ARG (e, 4) |
| #define SIG_6(f, a, b, c, d, e, g) SIG_5 (f, a, b, c, d, e) | ARG (g, 5) |
| |
| // convenience macro to define member function overload id's |
| // where the first argument encodes the constness of the member |
| // function (or the lack thereof) |
| #define MEMBER_0(f, self) \ |
| FID_0 (f) = SIG_1 (f, self) | bit_member |
| #define MEMBER_1(f, self, a) \ |
| FID_1 (f, a) = SIG_2 (f, self, a) | bit_member |
| #define MEMBER_2(f, self, a, b) \ |
| FID_2 (f, a, b) = SIG_3 (f, self, a, b) | bit_member |
| #define MEMBER_3(f, self, a, b, c) \ |
| FID_3 (f, a, b, c) = SIG_4 (f, self, a, b, c) | bit_member |
| #define MEMBER_4(f, self, a, b, c, d) \ |
| FID_4 (f, a, b, c, d) = SIG_5 (f, self, a, b, c, d) | bit_member |
| #define MEMBER_5(f, self, a, b, c, d, e) \ |
| FID_5 (f, a, b, c, d, e) = SIG_6 (f, self, a, b, c, d, e) | bit_member |
| |
| // convenience macro to define non-member function overload id's |
| #define NON_MEMBER_0(f) \ |
| FID_0 (f) = SIG_0 (f) |
| #define NON_MEMBER_1(f, a) \ |
| FID_1 (f, a) = SIG_1 (f, a) |
| #define NON_MEMBER_2(f, a, b) \ |
| FID_2 (f, a, b) = SIG_2 (f, a, b) |
| #define NON_MEMBER_3(f, a, b, c) \ |
| FID_3 (f, a, b, c) = SIG_3 (f, a, b, c) |
| #define NON_MEMBER_4(f, a, b, c, d) \ |
| FID_4 (f, a, b, c, d) = SIG_4 (f, a, b, c, d) |
| #define NON_MEMBER_5(f, a, b, c, d, e) \ |
| FID_5 (f, a, b, c, d, e) = SIG_5 (f, a, b, c, d, e) |
| |
| #else // #ifdef RW_SIGDEFS_H_INCLUDED |
| |
| // clean up helper macros used above |
| #undef _FCAT |
| #undef FCAT |
| #undef FID_0 |
| #undef FID_1 |
| #undef FID_2 |
| #undef FID_3 |
| #undef FID_4 |
| #undef FID_5 |
| |
| #undef ARG |
| |
| #undef SIG_0 |
| #undef SIG_1 |
| #undef SIG_2 |
| #undef SIG_3 |
| #undef SIG_4 |
| #undef SIG_5 |
| |
| #undef MEMBER_0 |
| #undef MEMBER_1 |
| #undef MEMBER_2 |
| #undef MEMBER_3 |
| #undef MEMBER_4 |
| #undef MEMBER_5 |
| |
| #undef RW_SIGDEFS_H_INCLUDED |
| |
| #endif // RW_SIGDEFS_H_INCLUDED |