swig/Lib/std/std_function.i

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;
};
}