Compare commits

..

61 Commits

Author SHA1 Message Date
nobody
cded2c28f5 This commit was manufactured by cvs2svn to create branch 'mpl_v2_2'.
[SVN r18675]
2003-06-05 05:15:05 +00:00
Douglas Gregor
a753dbc048 Jamfile.v2: Jamfile for Boost.Function documentation
[SVN r18244]
2003-04-13 14:51:26 +00:00
Douglas Gregor
ce00e49978 Newer Borland compiler still does not handle enable_if
[SVN r18064]
2003-03-23 16:58:05 +00:00
Douglas Gregor
eeb15caff2 Document nested class template "sig"
[SVN r17946]
2003-03-16 02:00:20 +00:00
Douglas Gregor
ade6c96d5c Updated to reflect BoostBook changes
[SVN r17941]
2003-03-15 23:12:35 +00:00
Douglas Gregor
b54e9df555 Lots of cleanups as BoostBook becomes more strict
[SVN r17871]
2003-03-13 00:29:57 +00:00
Douglas Gregor
eb14b70c9c Move away from attributes, toward elements
[SVN r17869]
2003-03-13 00:08:34 +00:00
Douglas Gregor
48e2bc0bdb Import of BoostBook documentation for any, array, bind, function, ref, and
signals libraries.


[SVN r17866]
2003-03-12 23:27:25 +00:00
Douglas Gregor
652955dee5 The old HTML Function documentation has been removed. The file index.html
redirects to $BOOST_ROOT/doc/html/function.html, the new home for the Function
library documentation


[SVN r17467]
2003-02-17 04:43:49 +00:00
Douglas Gregor
a44c07104c Regenerated, with function_test renamed to lib_function_test
[SVN r17420]
2003-02-14 18:15:01 +00:00
Douglas Gregor
af75e6622e Regenerated, with license and copyright info
[SVN r17419]
2003-02-14 18:05:26 +00:00
Douglas Gregor
07f4c425e3 Workaround for a Visual Age C++ preprocessor issue
[SVN r17407]
2003-02-14 15:34:39 +00:00
Douglas Gregor
25d109144d Don't omit template parameter names (Markus Schöpflin)
[SVN r17333]
2003-02-12 18:46:12 +00:00
Douglas Gregor
6ac619c12b Lots o' copyright statements
[SVN r17265]
2003-02-07 14:03:37 +00:00
Beman Dawes
c76d87f4ad rename function_test to lib_function_test due to clash file libs/functional
[SVN r17141]
2003-01-31 23:56:11 +00:00
Douglas Gregor
eb8a563a3b Suppress warnings on HP aCC
[SVN r17089]
2003-01-30 14:25:00 +00:00
Douglas Gregor
300ca5bdef Delete nothrow, new throw
[SVN r17088]
2003-01-30 14:22:28 +00:00
Douglas Gregor
9bc263cf97 Regenerated
[SVN r17084]
2003-01-30 04:42:06 +00:00
Douglas Gregor
8b6ebc4c42 >> std::endl; is bad :)
[SVN r17078]
2003-01-29 13:49:14 +00:00
Dave Abrahams
3cb116cf11 aCC workaround
[SVN r16975]
2003-01-21 13:54:27 +00:00
Douglas Gregor
09657f1134 Fixed broken testcases that came from tutorial sample code
[SVN r16935]
2003-01-19 14:44:34 +00:00
Douglas Gregor
4a46b5e1b9 Generated from XML
[SVN r16929]
2003-01-18 15:07:06 +00:00
Douglas Gregor
951cb3acd4 Testcases autogenerated from the Boost.Function tutorial
[SVN r16711]
2002-12-28 03:44:00 +00:00
Beman Dawes
3b644dbfff add or update See www.boost.org comments
[SVN r16708]
2002-12-27 16:51:53 +00:00
Douglas Gregor
d6659e26d7 function_base.hpp: Borland's new update has the same enable_if bug
[SVN r16678]
2002-12-22 14:28:29 +00:00
Douglas Gregor
535612ec85 function_base.hpp:
- Use BOOST_WORKAROUND more
  - Borland C++ 5.5 update 2 doesn't support enable_if
  - MSVC 7.0 needs the comparison-with-zero workarounds


[SVN r16636]
2002-12-17 13:50:07 +00:00
Douglas Gregor
c4451e5a64 Remove MSVC-specific hack
[SVN r16626]
2002-12-16 22:48:07 +00:00
Douglas Gregor
a75e20c3ed Support comparisons against 0 on MSVC
[SVN r16618]
2002-12-15 16:05:01 +00:00
Douglas Gregor
b62c8066a3 Forward-declare function_base for use in the allocator
[SVN r16617]
2002-12-15 15:20:28 +00:00
Douglas Gregor
30917e9f6a MIPSpro's library needs to use allocator<function_base>, not allocator<void>
[SVN r16616]
2002-12-15 15:13:51 +00:00
Douglas Gregor
b8d3e01e42 Removed enable_if checks: the same syntax is supported regardless of support
for enable_if


[SVN r16615]
2002-12-15 14:55:07 +00:00
Douglas Gregor
450959d0d7 Use boost/assert.hpp to check (at runtime) if the int passed to Boost.Function's
clearing constructor is zero


[SVN r16614]
2002-12-15 14:54:32 +00:00
Douglas Gregor
da9d12d1b9 function_template.hpp:
- When enable_if is not supported, supply an int version of the constructor
    and assignment operator so that the '= 0' or construct-with-0 syntax is
    usable


[SVN r16613]
2002-12-15 14:51:16 +00:00
Douglas Gregor
4466a7c9c0 function_base.hpp:
- GCC 3.0 and later do support enable_if. Not sure what happened there...
  - Use BOOST_WORKAROUND in some places (more to come...)


[SVN r16612]
2002-12-15 14:45:13 +00:00
Douglas Gregor
1e262bc976 function_n_test.cpp: Add a missing #endif
[SVN r16595]
2002-12-12 13:44:04 +00:00
Douglas Gregor
b58acb02e3 BOOST_NO_CONFIG -> BOOST_STRICT_CONFIG (Dave Abrahams)
[SVN r16524]
2002-12-05 12:28:19 +00:00
Dave Abrahams
06539c093f Suppress warnings on HP aCC
[SVN r16515]
2002-12-04 16:19:39 +00:00
Dave Abrahams
949a459d8a SunPro CC workaround
[SVN r16514]
2002-12-04 16:18:31 +00:00
Dave Abrahams
4cc84aff24 Disable function-type partial specializations for SunPro
[SVN r16512]
2002-12-04 15:55:34 +00:00
Dave Abrahams
9cf5e8efbe Workaround Sun and HP bugs
[SVN r16511]
2002-12-04 15:54:33 +00:00
Douglas Gregor
17427dfa3b Borland C++ 5.6.0 doesn't handle enable_if
[SVN r16262]
2002-11-15 19:26:39 +00:00
Douglas Gregor
7dcd9cd224 Metrowerks 7.2 can't handle enable_if
[SVN r16226]
2002-11-13 21:00:23 +00:00
Douglas Gregor
f54bd9f08d function_template.hpp:
- Wrap ICEs in parentheses when used as template arguments


[SVN r16225]
2002-11-13 18:03:55 +00:00
Douglas Gregor
7baa23912d Fix on BCC 5.6.1 (Hugo Duncan)
[SVN r16216]
2002-11-12 22:36:29 +00:00
Douglas Gregor
79fca4d1b2 MSVC 7.0 broken. Go figure
[SVN r16179]
2002-11-09 21:05:46 +00:00
Douglas Gregor
18d09833f7 Neither MSVC nor Borland can handle enable_if. Big surprise.
[SVN r16177]
2002-11-09 17:16:24 +00:00
Douglas Gregor
aa2c2520ad Make sure to pass the address of a function to Boost.Function, not the function itself (stupid MSVC)
[SVN r16176]
2002-11-09 17:12:45 +00:00
Douglas Gregor
5574a6e97d MIPSpro 7.3.1.3m can't support enable_if
[SVN r16175]
2002-11-09 16:26:47 +00:00
Douglas Gregor
17b311cbbd Support assignment from 0, construction from 0, and comparison to zero.
[SVN r16174]
2002-11-09 16:02:47 +00:00
Douglas Gregor
4fed545468 function_n_test.cpp:
- Don't test == 0 syntax (it isn't supported)


[SVN r16115]
2002-11-05 14:36:49 +00:00
Douglas Gregor
17ded4b8bf - Added sig member template support for Boost.Lambda, with testcase (Michael Hohmuth)
- Removed the assignment-to-zero attempt

- Added bad_function_call exception (using boost::throw_exception)


[SVN r16102]
2002-11-04 18:19:01 +00:00
Douglas Gregor
9a09d9e044 index.html: Make valid HTML 4.01
[SVN r15839]
2002-10-10 05:40:42 +00:00
Douglas Gregor
374711d2c6 function_template.hpp:
- function partial specialization now allows assignment to zero
    (for clearing) and comparison against zero (for the empty check)
    (Brad King)

function_test.cpp:
  - Check comparison against zero
  - Check assignment to zero

function_test_fail1.cpp:
function_test_fail2.cpp:
  - Make them fail for the right reasons


[SVN r15803]
2002-10-08 02:32:38 +00:00
Ralf W. Grosse-Kunstleve
300fde19a1 namespace name in the MIPSpro workaround corrected
[SVN r15516]
2002-09-25 20:02:31 +00:00
Douglas Gregor
8f578dbc78 function_template.hpp:
- Don't let Borland C++ use class template function

function_base.hpp:
  - Work around freaky MIPSpro bug that affects the Python lib


[SVN r15514]
2002-09-25 18:10:32 +00:00
Douglas Gregor
e3386d8e7e Fixes for MSVC 6.0sp5
[SVN r15502]
2002-09-25 03:30:18 +00:00
Douglas Gregor
68d6a1354e function_template.hpp:
- Remove tabs

prologue.hpp:
  - get BOOST_PP_INC


[SVN r15501]
2002-09-24 19:52:56 +00:00
Douglas Gregor
6c8e07793d function_base.hpp:
- make make_any_pointer inline


[SVN r15500]
2002-09-24 19:27:51 +00:00
Douglas Gregor
8b6f154891 function_base.hpp:
- Don't try to implicitly convert a function pointer to a data pointer

stateless_test.cpp:
  - Don't use the deprecated syntax


[SVN r15499]
2002-09-24 17:28:58 +00:00
Douglas Gregor
f9ae459b2d - Removed everything deprecated in 1.29.0
- Deprecate user use of function_base
- Use the Boost Preprocessor library to make Function scalable to any
  (reasonable) number of arguments
- Make any_pointer a POD (oops)
- Test Boost.Function for 30 arguments
- Remove tests of deprecated features


[SVN r15498]
2002-09-24 17:16:17 +00:00
Douglas Gregor
f36e83fb27 function_base.hpp:
- Remove safe_bool conversion and operator! from class function_base

function_template.hpp:
  - Add safe_bool conversion and operator!
  - operator! returns bool, not safe_bool (Peter Dimov)

reference.html:
  - Document above change


[SVN r15356]
2002-09-16 03:44:18 +00:00
2 changed files with 70 additions and 598 deletions

View File

@@ -0,0 +1,70 @@
// Boost.Function library
// Copyright (C) 2001, 2002 Doug Gregor (gregod@cs.rpi.edu)
//
// Permission to copy, use, sell and distribute this software is granted
// provided this copyright notice appears in all copies.
// Permission to modify the code and to distribute modified code is granted
// provided this copyright notice appears in all copies, and a notice
// that the code was modified is included with the copyright notice.
//
// This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose.
// For more information, see http://www.boost.org/libs/function
// William Kempf, Jesse Jones and Karl Nelson were all very helpful in the
// design of this library.
#include <boost/preprocessor/iterate.hpp>
#include <boost/detail/workaround.hpp>
#ifndef BOOST_FUNCTION_MAX_ARGS
# define BOOST_FUNCTION_MAX_ARGS 10
#endif // BOOST_FUNCTION_MAX_ARGS
// Include the prologue here so that the use of file-level iteration
// in anything that may be included by function_template.hpp doesn't break
#include <boost/function/detail/prologue.hpp>
// Visual Age C++ doesn't handle the file iteration well
#if BOOST_WORKAROUND(__IBMCPP__, <= 600)
# if BOOST_FUNCTION_MAX_ARGS >= 0
# include <boost/function/function0.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 1
# include <boost/function/function1.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 2
# include <boost/function/function2.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 3
# include <boost/function/function3.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 4
# include <boost/function/function4.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 5
# include <boost/function/function5.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 6
# include <boost/function/function6.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 7
# include <boost/function/function7.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 8
# include <boost/function/function8.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 9
# include <boost/function/function9.hpp>
# endif
# if BOOST_FUNCTION_MAX_ARGS >= 10
# include <boost/function/function10.hpp>
# endif
#else
// What is the '3' for?
# define BOOST_PP_ITERATION_PARAMS_1 (3,(0,BOOST_FUNCTION_MAX_ARGS,<boost/function/detail/function_iterate.hpp>))
# include BOOST_PP_ITERATE()
# undef BOOST_PP_ITERATION_PARAMS_1
#endif

View File

@@ -1,598 +0,0 @@
// Boost.Function library
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
//
// Permission to copy, use, sell and distribute this software is granted
// provided this copyright notice appears in all copies.
// Permission to modify the code and to distribute modified code is granted
// provided this copyright notice appears in all copies, and a notice
// that the code was modified is included with the copyright notice.
//
// This software is provided "as is" without express or implied warranty,
// and with no claim as to its suitability for any purpose.
// For more information, see http://www.boost.org
// Note: this header is a header template and must NOT have multiple-inclusion
// protection.
#ifndef BOOST_FUNCTION_FUNCTION_TEMPLATE_HPP
#define BOOST_FUNCTION_FUNCTION_TEMPLATE_HPP
# include <cassert>
# include <algorithm>
# include <boost/config.hpp>
# include <boost/function/function_base.hpp>
# include <boost/mem_fn.hpp>
# include <boost/type_traits/arithmetic_traits.hpp>
#endif // BOOST_FUNCTION_FUNCTION_TEMPLATE_HPP
// Type of the default allocator
#ifndef BOOST_NO_STD_ALLOCATOR
# define BOOST_FUNCTION_DEFAULT_ALLOCATOR std::allocator<function_base>
#else
# define BOOST_FUNCTION_DEFAULT_ALLOCATOR int
#endif // BOOST_NO_STD_ALLOCATOR
// Comma if nonzero number of arguments
#if BOOST_FUNCTION_NUM_ARGS == 0
# define BOOST_FUNCTION_COMMA
#else
# define BOOST_FUNCTION_COMMA ,
#endif // BOOST_FUNCTION_NUM_ARGS > 0
// Class names used in this version of the code
#define BOOST_FUNCTION_FUNCTION BOOST_JOIN(function,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_FUNCTION_INVOKER \
BOOST_JOIN(function_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_VOID_FUNCTION_INVOKER \
BOOST_JOIN(void_function_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(void_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_STATELESS_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(stateless_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_STATELESS_VOID_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(stateless_void_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_GET_FUNCTION_INVOKER \
BOOST_JOIN(get_function_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(get_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
#define BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER \
BOOST_JOIN(get_stateless_function_obj_invoker,BOOST_FUNCTION_NUM_ARGS)
namespace boost {
namespace detail {
namespace function {
template<
typename FunctionPtr,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_FUNCTION_INVOKER
{
static R invoke(any_pointer function_ptr BOOST_FUNCTION_COMMA
BOOST_FUNCTION_PARMS)
{
FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
return f(BOOST_FUNCTION_ARGS);
}
};
template<
typename FunctionPtr,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_VOID_FUNCTION_INVOKER
{
static unusable invoke(any_pointer function_ptr BOOST_FUNCTION_COMMA
BOOST_FUNCTION_PARMS)
{
FunctionPtr f = reinterpret_cast<FunctionPtr>(function_ptr.func_ptr);
f(BOOST_FUNCTION_ARGS);
return unusable();
}
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_FUNCTION_OBJ_INVOKER
{
static R invoke(any_pointer function_obj_ptr BOOST_FUNCTION_COMMA
BOOST_FUNCTION_PARMS)
{
FunctionObj* f = (FunctionObj*)(function_obj_ptr.obj_ptr);
return (*f)(BOOST_FUNCTION_ARGS);
}
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER
{
static unusable invoke(any_pointer function_obj_ptr
BOOST_FUNCTION_COMMA
BOOST_FUNCTION_PARMS)
{
FunctionObj* f = (FunctionObj*)(function_obj_ptr.obj_ptr);
(*f)(BOOST_FUNCTION_ARGS);
return unusable();
}
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_STATELESS_FUNCTION_OBJ_INVOKER
{
static R invoke(any_pointer BOOST_FUNCTION_COMMA BOOST_FUNCTION_PARMS)
{
FunctionObj f = FunctionObj();
return f(BOOST_FUNCTION_ARGS);
}
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_STATELESS_VOID_FUNCTION_OBJ_INVOKER
{
static unusable invoke(any_pointer BOOST_FUNCTION_COMMA
BOOST_FUNCTION_PARMS)
{
FunctionObj f = FunctionObj();
f(BOOST_FUNCTION_ARGS);
return unusable();
}
};
template<
typename FunctionPtr,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_GET_FUNCTION_INVOKER
{
BOOST_STATIC_CONSTANT(bool, is_void_ = ::boost::is_void<R>::value);
typedef typename ct_if<is_void_,
BOOST_FUNCTION_VOID_FUNCTION_INVOKER<
FunctionPtr,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>,
BOOST_FUNCTION_FUNCTION_INVOKER<
FunctionPtr,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>
>::type type;
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER
{
BOOST_STATIC_CONSTANT(bool, is_void_ = ::boost::is_void<R>::value);
typedef typename ct_if<is_void_,
BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>,
BOOST_FUNCTION_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>
>::type type;
};
template<
typename FunctionObj,
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS
>
struct BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER
{
BOOST_STATIC_CONSTANT(bool, is_void_ = ::boost::is_void<R>::value);
typedef typename ct_if<is_void_,
BOOST_FUNCTION_STATELESS_VOID_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>,
BOOST_FUNCTION_STATELESS_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>
>::type type;
};
} // end namespace function
} // end namespace detail
template<
typename R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_PARMS,
#ifndef BOOST_FUNCTION_NO_DEPRECATED
typename Policy = empty_function_policy,
typename Mixin = empty_function_mixin,
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
>
class BOOST_FUNCTION_FUNCTION : public function_base
#ifndef BOOST_FUNCTION_NO_DEPRECATED
, public Mixin
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
{
typedef typename detail::function::function_return_type<R>::type
internal_result_type;
public:
BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS);
#if BOOST_FUNCTION_NUM_ARGS == 1
typedef T0 argument_type;
#elif BOOST_FUNCTION_NUM_ARGS == 2
typedef T0 first_argument_type;
typedef T1 second_argument_type;
#endif
BOOST_STATIC_CONSTANT(int, arity = BOOST_FUNCTION_NUM_ARGS);
BOOST_FUNCTION_ARG_TYPES
#ifndef BOOST_NO_VOID_RETURNS
typedef R result_type;
#else
typedef internal_result_type result_type;
#endif // BOOST_NO_VOID_RETURNS
#ifndef BOOST_FUNCTION_NO_DEPRECATED
typedef Policy policy_type;
typedef Mixin mixin_type;
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
typedef Allocator allocator_type;
typedef BOOST_FUNCTION_FUNCTION self_type;
BOOST_FUNCTION_FUNCTION() : function_base()
#ifndef BOOST_FUNCTION_NO_DEPRECATED
, Mixin()
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
, invoker(0) {}
#ifndef BOOST_FUNCTION_NO_DEPRECATED
explicit BOOST_FUNCTION_FUNCTION(const Mixin& m) :
function_base(),
Mixin(m),
invoker(0)
{
}
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
// MSVC chokes if the following two constructors are collapsed into
// one with a default parameter.
template<typename Functor>
BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f) :
function_base(),
#ifndef BOOST_FUNCTION_NO_DEPRECATED
Mixin(),
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
invoker(0)
{
this->assign_to(f);
}
#ifndef BOOST_FUNCTION_NO_DEPRECATED
template<typename Functor>
BOOST_FUNCTION_FUNCTION(Functor f, const Mixin& m) :
function_base(),
Mixin(m),
invoker(0)
{
this->assign_to(f);
}
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
BOOST_FUNCTION_FUNCTION(const BOOST_FUNCTION_FUNCTION& f) :
function_base(),
#ifndef BOOST_FUNCTION_NO_DEPRECATED
Mixin(static_cast<const Mixin&>(f)),
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
invoker(0)
{
this->assign_to_own(f);
}
~BOOST_FUNCTION_FUNCTION() { clear(); }
result_type operator()(BOOST_FUNCTION_PARMS) const
{
assert(!this->empty());
#ifndef BOOST_FUNCTION_NO_DEPRECATED
policy_type policy;
policy.precall(this);
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
internal_result_type result = invoker(function_base::functor
BOOST_FUNCTION_COMMA
BOOST_FUNCTION_ARGS);
#ifndef BOOST_FUNCTION_NO_DEPRECATED
policy.postcall(this);
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
#ifndef BOOST_NO_VOID_RETURNS
return static_cast<result_type>(result);
#else
return result;
#endif // BOOST_NO_VOID_RETURNS
}
// The distinction between when to use BOOST_FUNCTION_FUNCTION and
// when to use self_type is obnoxious. MSVC cannot handle self_type as
// the return type of these assignment operators, but Borland C++ cannot
// handle BOOST_FUNCTION_FUNCTION as the type of the temporary to
// construct.
template<typename Functor>
BOOST_FUNCTION_FUNCTION&
operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
{
#ifndef BOOST_FUNCTION_NO_DEPRECATED
self_type(f, static_cast<const Mixin&>(*this)).swap(*this);
#else
self_type(f).swap(*this);
#endif // BOOST_FUNCTION_NO_DEPRECATED
return *this;
}
#ifndef BOOST_FUNCTION_NO_DEPRECATED
template<typename Functor>
BOOST_FUNCTION_DEPRECATED_PRE
void set(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
{
BOOST_FUNCTION_DEPRECATED_INNER
self_type(f, static_cast<const Mixin&>(*this)).swap(*this);
}
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
// Assignment from another BOOST_FUNCTION_FUNCTION
BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f)
{
if (&f == this)
return *this;
self_type(f).swap(*this);
return *this;
}
#ifndef BOOST_FUNCTION_NO_DEPRECATED
// Assignment from another BOOST_FUNCTION_FUNCTION
BOOST_FUNCTION_DEPRECATED_PRE
void set(const BOOST_FUNCTION_FUNCTION& f)
{
BOOST_FUNCTION_DEPRECATED_INNER
if (&f == this)
return;
self_type(f).swap(*this);
}
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
void swap(BOOST_FUNCTION_FUNCTION& other)
{
if (&other == this)
return;
std::swap(function_base::manager, other.manager);
std::swap(function_base::functor, other.functor);
std::swap(invoker, other.invoker);
#ifndef BOOST_FUNCTION_NO_DEPRECATED
std::swap(static_cast<Mixin&>(*this), static_cast<Mixin&>(other));
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
}
// Clear out a target, if there is one
void clear()
{
if (function_base::manager) {
function_base::functor =
function_base::manager(function_base::functor,
detail::function::destroy_functor_tag);
}
function_base::manager = 0;
invoker = 0;
}
private:
void assign_to_own(const BOOST_FUNCTION_FUNCTION& f)
{
if (!f.empty()) {
invoker = f.invoker;
function_base::manager = f.manager;
function_base::functor =
f.manager(f.functor, detail::function::clone_functor_tag);
}
}
template<typename Functor>
void assign_to(Functor f)
{
typedef typename detail::function::get_function_tag<Functor>::type tag;
this->assign_to(f, tag());
}
template<typename FunctionPtr>
void assign_to(FunctionPtr f, detail::function::function_ptr_tag)
{
clear();
if (f) {
typedef typename detail::function::BOOST_FUNCTION_GET_FUNCTION_INVOKER<
FunctionPtr,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>::type
invoker_type;
invoker = &invoker_type::invoke;
function_base::manager =
&detail::function::functor_manager<FunctionPtr, Allocator>::manage;
function_base::functor =
function_base::manager(detail::function::any_pointer(
// should be a reinterpret cast, but some compilers
// insist on giving cv-qualifiers to free functions
(void (*)())(f)
),
detail::function::clone_functor_tag);
}
}
#if BOOST_FUNCTION_NUM_ARGS > 0
template<typename MemberPtr>
void assign_to(MemberPtr f, detail::function::member_ptr_tag)
{
this->assign_to(mem_fn(f));
}
#endif // BOOST_FUNCTION_NUM_ARGS > 0
template<typename FunctionObj>
void assign_to(FunctionObj f, detail::function::function_obj_tag)
{
if (!detail::function::has_empty_target(addressof(f))) {
typedef
typename detail::function::BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>::type
invoker_type;
invoker = &invoker_type::invoke;
function_base::manager = &detail::function::functor_manager<
FunctionObj, Allocator>::manage;
#ifndef BOOST_NO_STD_ALLOCATOR
typedef typename Allocator::template rebind<FunctionObj>::other
allocator_type;
typedef typename allocator_type::pointer pointer_type;
allocator_type allocator;
pointer_type copy = allocator.allocate(1);
allocator.construct(copy, f);
// Get back to the original pointer type
FunctionObj* new_f = static_cast<FunctionObj*>(copy);
#else
FunctionObj* new_f = new FunctionObj(f);
#endif // BOOST_NO_STD_ALLOCATOR
function_base::functor =
detail::function::any_pointer(static_cast<void*>(new_f));
}
}
template<typename FunctionObj>
void assign_to(const reference_wrapper<FunctionObj>& f,
detail::function::function_obj_ref_tag)
{
if (!detail::function::has_empty_target(f.get_pointer())) {
typedef
typename detail::function::BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>::type
invoker_type;
invoker = &invoker_type::invoke;
function_base::manager = &detail::function::trivial_manager;
function_base::functor =
function_base::manager(
detail::function::any_pointer(
const_cast<FunctionObj*>(f.get_pointer())),
detail::function::clone_functor_tag);
}
}
template<typename FunctionObj>
void assign_to(FunctionObj, detail::function::stateless_function_obj_tag)
{
typedef
typename detail::function::
BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER<
FunctionObj,
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS
>::type
invoker_type;
invoker = &invoker_type::invoke;
function_base::manager = &detail::function::trivial_manager;
function_base::functor = detail::function::any_pointer(this);
}
typedef internal_result_type (*invoker_type)(detail::function::any_pointer
BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS);
invoker_type invoker;
};
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS ,
#ifndef BOOST_FUNCTION_NO_DEPRECATED
typename Policy, typename Mixin,
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
typename Allocator>
inline void swap(BOOST_FUNCTION_FUNCTION<
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS ,
#ifndef BOOST_FUNCTION_NO_DEPRECATED
Policy,
Mixin,
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
Allocator
>& f1,
BOOST_FUNCTION_FUNCTION<
R BOOST_FUNCTION_COMMA
BOOST_FUNCTION_TEMPLATE_ARGS,
#ifndef BOOST_FUNCTION_NO_DEPRECATED
Policy,
Mixin,
#endif // ndef BOOST_FUNCTION_NO_DEPRECATED
Allocator
>& f2)
{
f1.swap(f2);
}
}
// Cleanup after ourselves...
#undef BOOST_FUNCTION_DEFAULT_ALLOCATOR
#undef BOOST_FUNCTION_COMMA
#undef BOOST_FUNCTION_FUNCTION
#undef BOOST_FUNCTION_FUNCTION_INVOKER
#undef BOOST_FUNCTION_VOID_FUNCTION_INVOKER
#undef BOOST_FUNCTION_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_VOID_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_STATELESS_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_STATELESS_VOID_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_GET_FUNCTION_INVOKER
#undef BOOST_FUNCTION_GET_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_GET_STATELESS_FUNCTION_OBJ_INVOKER
#undef BOOST_FUNCTION_GET_MEM_FUNCTION_INVOKER