mirror of https://github.com/swig/swig.git
50 lines
1.9 KiB
OpenEdge ABL
50 lines
1.9 KiB
OpenEdge ABL
/* -----------------------------------------------------------------------------
|
|
* std_function.i
|
|
*
|
|
* Generic std::function wrappers.
|
|
*
|
|
* To use std::function
|
|
* 1. Provide a factory function that will return the C++ callable std::function
|
|
* required.
|
|
* 2. Instantiate the std::function template with a suitable parameter pack.
|
|
*
|
|
* Example:
|
|
* std::function<bool(int, const std::string &)> MakeLambda(int pass) {
|
|
* return [pass](int passcode, const std::string &name) -> bool {
|
|
* return passcode == pass && name == "magic";
|
|
* };
|
|
* }
|
|
* %template(MyLambda) std::function<bool(int, const std::string &)>;
|
|
*
|
|
* Instantiate it and call the operator() wrapper (renamed to call), for example
|
|
* from Java:
|
|
*
|
|
* MyLambda fn = MakeLambda(10);
|
|
* boolean result = fn.call(10, "magic");
|
|
* ----------------------------------------------------------------------------- */
|
|
|
|
%rename(call) std::function::operator();
|
|
%ignore std::function::function();
|
|
|
|
// By default SWIG attempts to rename any symbol called 'function' as it is a reserved keyword in some languages.
|
|
// Unfortunately, %namewarn for 'function' (which is essentially a %rename) overrides the %template name.
|
|
// The rename could be avoided with a more targed rename, in addition to the %template, such as:
|
|
// %template(MyLambda) std::function<bool(int, const std::string &)>;
|
|
// But requires users to give the name twice, instead we use the trick below to effectively ignore the %namewarn.
|
|
#if defined(SWIGD) || defined(SWIGJAVASCRIPT) || defined(SWIGLUA) || defined(SWIGPHP) || defined(SWIGR)
|
|
// The %namewarn below purposefully omits the 'rename="_%s"' attribute as a trick to not rename
|
|
%namewarn("314"":""'function' is a keyword") std::function;
|
|
#endif
|
|
|
|
|
|
namespace std {
|
|
template <typename> class function;
|
|
template <typename RET, typename... ARGS> class function<RET(ARGS...)> {
|
|
public:
|
|
using result_type = RET;
|
|
|
|
function() = default;
|
|
RET operator()(ARGS...) const;
|
|
};
|
|
}
|