// (C) Copyright David Abrahams 2000. Permission to copy, use, modify, sell and // distribute this software is granted provided this copyright notice appears // in all copies. This software is provided "as is" without express or implied // warranty, and with no claim as to its suitability for any purpose. // // The author gratefully acknowleges the support of Dragon Systems, Inc., in // producing this work. // // This file automatically generated by gen_signatures.python for 10 arguments. #ifndef SIGNATURES_DWA050900_H_ # define SIGNATURES_DWA050900_H_ # include "pyconfig.h" namespace python { namespace detail { // A stand-in for the built-in void. This one can be passed to functions and // (under MSVC, which has a bug, be used as a default template type parameter). struct void_t {}; } // namespace detail // An envelope in which type information can be delivered for the purposes // of selecting an overloaded from_python() function. This is needed to work // around MSVC's lack of partial specialiation/ordering. Where normally we'd // want to form a function call like void f(), We instead pass // type as one of the function parameters to select a particular // overload. // // The id typedef helps us deal with the lack of partial ordering by generating // unique types for constructor signatures. In general, type::id is type, // but type::id is just void_t. template struct type { typedef type id; }; template <> struct type { typedef python::detail::void_t id; }; namespace detail { // These basically encapsulate a chain of types, , used to make the syntax of // add(constructor()) work. We need to produce a unique type for each number // of non-default parameters to constructor<>. Q: why not use a recursive // formulation for infinite extensibility? A: MSVC6 seems to choke on constructs // that involve recursive template nesting. // // signature chaining template struct signature10 {}; template struct signature9 {}; template inline signature10 prepend(type, signature9) { return signature10(); } template struct signature8 {}; template inline signature9 prepend(type, signature8) { return signature9(); } template struct signature7 {}; template inline signature8 prepend(type, signature7) { return signature8(); } template struct signature6 {}; template inline signature7 prepend(type, signature6) { return signature7(); } template struct signature5 {}; template inline signature6 prepend(type, signature5) { return signature6(); } template struct signature4 {}; template inline signature5 prepend(type, signature4) { return signature5(); } template struct signature3 {}; template inline signature4 prepend(type, signature3) { return signature4(); } template struct signature2 {}; template inline signature3 prepend(type, signature2) { return signature3(); } template struct signature1 {}; template inline signature2 prepend(type, signature1) { return signature2(); } struct signature0 {}; template inline signature1 prepend(type, signature0) { return signature1(); } // This one terminates the chain. Prepending void_t to the head of a void_t // signature results in a void_t signature again. inline signature0 prepend(void_t, signature0) { return signature0(); } } // namespace detail template struct constructor { }; namespace detail { // Return value extraction: // This is just another little envelope for carrying a typedef (see type, // above). I could have re-used type, but that has a very specific purpose. I // thought this would be clearer. template struct return_value_select { typedef T type; }; // free functions template return_value_select return_value(R (*)()) { return return_value_select(); } template return_value_select return_value(R (*)(A1)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5, A6)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5, A6, A7)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5, A6, A7, A8)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) { return return_value_select(); } template return_value_select return_value(R (*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) { return return_value_select(); } // TODO(?): handle 'const void' // member functions template return_value_select return_value(R (T::*)()) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9)) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)) { return return_value_select(); } template return_value_select return_value(R (T::*)() const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9) const) { return return_value_select(); } template return_value_select return_value(R (T::*)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) const) { return return_value_select(); } }} // namespace python::detail #endif