mirror of
https://github.com/boostorg/function.git
synced 2025-06-25 12:01:38 +02:00
Compare commits
4 Commits
boost-1.36
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
5d7f4aae46 | |||
9a4d7447a7 | |||
83481662bb | |||
64b6e85a94 |
@ -1,6 +1,6 @@
|
||||
// Boost.Function library
|
||||
|
||||
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
|
||||
// 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.
|
||||
@ -53,13 +53,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function0<R, Policy, Mixin, Allocator> type;
|
||||
typedef function0<R, ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -78,13 +77,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function1<R, T1, Policy, Mixin, Allocator> type;
|
||||
typedef function1<R, T1, ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -103,13 +101,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function2<R, T1, T2, Policy, Mixin, Allocator> type;
|
||||
typedef function2<R, T1, T2, ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -128,13 +125,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function3<R, T1, T2, T3, Policy, Mixin, Allocator> type;
|
||||
typedef function3<R, T1, T2, T3, ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -153,13 +149,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function4<R, T1, T2, T3, T4, Policy, Mixin, Allocator> type;
|
||||
typedef function4<R, T1, T2, T3, T4, ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -178,13 +173,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function5<R, T1, T2, T3, T4, T5, Policy, Mixin, Allocator>
|
||||
typedef function5<R, T1, T2, T3, T4, T5, ThreadingPolicy, Allocator>
|
||||
type;
|
||||
};
|
||||
};
|
||||
@ -204,13 +198,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function6<R, T1, T2, T3, T4, T5, T6, Policy, Mixin, Allocator>
|
||||
typedef function6<R, T1, T2, T3, T4, T5, T6, ThreadingPolicy, Allocator>
|
||||
type;
|
||||
};
|
||||
};
|
||||
@ -230,13 +223,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function7<R, T1, T2, T3, T4, T5, T6, T7, Policy, Mixin,
|
||||
typedef function7<R, T1, T2, T3, T4, T5, T6, T7, ThreadingPolicy,
|
||||
Allocator> type;
|
||||
};
|
||||
};
|
||||
@ -256,13 +248,12 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function8<R, T1, T2, T3, T4, T5, T6, T7, T8, Policy, Mixin,
|
||||
typedef function8<R, T1, T2, T3, T4, T5, T6, T7, T8, ThreadingPolicy,
|
||||
Allocator> type;
|
||||
};
|
||||
};
|
||||
@ -282,14 +273,13 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, Policy,
|
||||
Mixin, Allocator> type;
|
||||
typedef function9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||
ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -308,14 +298,13 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy,
|
||||
typename Mixin,
|
||||
typename ThreadingPolicy,
|
||||
typename Allocator
|
||||
>
|
||||
struct params
|
||||
{
|
||||
typedef function10<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
|
||||
Policy, Mixin, Allocator> type;
|
||||
ThreadingPolicy, Allocator> type;
|
||||
};
|
||||
};
|
||||
|
||||
@ -331,16 +320,15 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename Policy = empty_function_policy,
|
||||
typename Mixin = empty_function_mixin,
|
||||
typename Allocator = std::allocator<function_base>
|
||||
typename ThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||
typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||
>
|
||||
struct get_function_impl
|
||||
{
|
||||
typedef typename real_get_function_impl<
|
||||
(count_used_args<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value)
|
||||
>::template params<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
|
||||
Policy, Mixin, Allocator>::type
|
||||
ThreadingPolicy, Allocator>::type
|
||||
type;
|
||||
};
|
||||
|
||||
@ -356,55 +344,37 @@ namespace boost {
|
||||
typename T8,
|
||||
typename T9,
|
||||
typename T10,
|
||||
typename MyPolicy = empty_function_policy,
|
||||
typename MyMixin = empty_function_mixin,
|
||||
typename MyAllocator = std::allocator<function_base>
|
||||
typename MyThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||
typename MyAllocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||
>
|
||||
struct function_traits_builder
|
||||
{
|
||||
typedef typename get_function_impl<R, T1, T2, T3, T4, T5, T6, T7,
|
||||
T8, T9, T10, MyPolicy, MyMixin,
|
||||
T8, T9, T10, MyThreadingPolicy,
|
||||
MyAllocator>::type
|
||||
type;
|
||||
|
||||
typedef MyPolicy policy_type;
|
||||
typedef MyMixin mixin_type;
|
||||
typedef MyThreadingPolicy threading_policy_type;
|
||||
typedef MyAllocator allocator_type;
|
||||
|
||||
#ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
|
||||
template<typename Policy>
|
||||
struct policy :
|
||||
template<typename ThreadingPolicy>
|
||||
struct threading_policy :
|
||||
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||
T10, Policy, mixin_type,
|
||||
allocator_type> {};
|
||||
|
||||
template<typename Mixin>
|
||||
struct mixin :
|
||||
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||
T10, policy_type, Mixin,
|
||||
T10, ThreadingPolicy,
|
||||
allocator_type> {};
|
||||
|
||||
template<typename Allocator>
|
||||
struct allocator :
|
||||
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||
T10, policy_type, mixin_type,
|
||||
T10, threading_policy_type,
|
||||
Allocator> {};
|
||||
#else
|
||||
template<typename Policy>
|
||||
struct policy
|
||||
template<typename ThreadingPolicy>
|
||||
struct threading_policy
|
||||
{
|
||||
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
||||
T8, T9, T10, Policy,
|
||||
mixin_type,
|
||||
allocator_type>::type
|
||||
type;
|
||||
};
|
||||
|
||||
template<typename Mixin>
|
||||
struct mixin
|
||||
{
|
||||
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
||||
T8, T9, T10, policy_type, Mixin,
|
||||
T8, T9, T10, ThreadingPolicy,
|
||||
allocator_type>::type
|
||||
type;
|
||||
};
|
||||
@ -413,8 +383,9 @@ namespace boost {
|
||||
struct allocator
|
||||
{
|
||||
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
||||
T8, T9, T10, policy_type,
|
||||
mixin_type, Allocator>::type
|
||||
T8, T9, T10,
|
||||
threading_policy_type,
|
||||
Allocator>::type
|
||||
type;
|
||||
};
|
||||
#endif
|
||||
@ -448,8 +419,7 @@ namespace boost {
|
||||
base_type;
|
||||
|
||||
public:
|
||||
typedef typename base_type::policy_type policy_type;
|
||||
typedef typename base_type::mixin_type mixin_type;
|
||||
typedef typename base_type::threading_policy_type policy_type;
|
||||
typedef typename base_type::allocator_type allocator_type;
|
||||
typedef function self_type;
|
||||
|
||||
@ -463,37 +433,21 @@ namespace boost {
|
||||
template<typename Functor>
|
||||
self_type& operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
base_type::operator=(f);
|
||||
return *this;
|
||||
}
|
||||
|
||||
self_type& operator=(const base_type& f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
base_type::operator=(f);
|
||||
return *this;
|
||||
}
|
||||
|
||||
self_type& operator=(const self_type& f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
base_type::operator=(static_cast<const base_type&>(f));
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename Functor>
|
||||
void set(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
}
|
||||
|
||||
void set(const base_type& f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
}
|
||||
|
||||
void set(const self_type& f)
|
||||
{
|
||||
self_type(f).swap(*this);
|
||||
}
|
||||
};
|
||||
|
||||
template<typename R,
|
||||
|
@ -1,6 +1,6 @@
|
||||
// Boost.Function library
|
||||
|
||||
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
|
||||
// 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.
|
||||
@ -24,6 +24,8 @@
|
||||
#include <boost/config.hpp>
|
||||
#include <boost/type_traits.hpp>
|
||||
#include <boost/ref.hpp>
|
||||
#include <boost/function/threading/single.hpp>
|
||||
#include <boost/pending/ct_if.hpp>
|
||||
|
||||
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(__ICL) && __ICL <= 600 || defined(__MWERKS__) && __MWERKS__ < 0x2406
|
||||
# define BOOST_FUNCTION_TARGET_FIX(x) x
|
||||
@ -31,54 +33,22 @@
|
||||
# define BOOST_FUNCTION_TARGET_FIX(x)
|
||||
#endif // not MSVC
|
||||
|
||||
#ifndef BOOST_FUNCTION_DEFAULT_THREADING_POLICY
|
||||
# define BOOST_FUNCTION_DEFAULT_THREADING_POLICY single_threaded
|
||||
#endif
|
||||
|
||||
// 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
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
namespace function {
|
||||
template<bool> struct truth {};
|
||||
|
||||
/*
|
||||
* The ct_if implementation is temporary code. When a Boost metaprogramming
|
||||
* library is introduced, Boost.Function will use it instead.
|
||||
*/
|
||||
namespace intimate {
|
||||
struct SelectThen
|
||||
{
|
||||
template<typename Then, typename Else>
|
||||
struct Result
|
||||
{
|
||||
typedef Then type;
|
||||
};
|
||||
};
|
||||
|
||||
struct SelectElse
|
||||
{
|
||||
template<typename Then, typename Else>
|
||||
struct Result
|
||||
{
|
||||
typedef Else type;
|
||||
};
|
||||
};
|
||||
|
||||
template<bool Condition>
|
||||
struct Selector
|
||||
{
|
||||
typedef SelectThen type;
|
||||
};
|
||||
|
||||
template<>
|
||||
struct Selector<false>
|
||||
{
|
||||
typedef SelectElse type;
|
||||
};
|
||||
} // end namespace intimate
|
||||
|
||||
template<bool Condition, typename Then, typename Else>
|
||||
struct ct_if
|
||||
{
|
||||
typedef typename intimate::Selector<Condition>::type select;
|
||||
typedef typename select::template Result<Then,Else>::type type;
|
||||
};
|
||||
|
||||
/**
|
||||
* A union of a function pointer and a void pointer. This is necessary
|
||||
* because 5.2.10/6 allows reinterpret_cast<> to safely cast between
|
||||
@ -158,7 +128,7 @@ namespace boost {
|
||||
// The trivial manager does nothing but return the same pointer (if we
|
||||
// are cloning) or return the null pointer (if we are deleting).
|
||||
inline any_pointer trivial_manager(any_pointer f,
|
||||
functor_manager_operation_type op)
|
||||
functor_manager_operation_type op)
|
||||
{
|
||||
if (op == clone_functor_tag)
|
||||
return f;
|
||||
@ -179,7 +149,7 @@ namespace boost {
|
||||
// For function pointers, the manager is trivial
|
||||
static inline any_pointer
|
||||
manager(any_pointer function_ptr,
|
||||
functor_manager_operation_type op,
|
||||
functor_manager_operation_type op,
|
||||
function_ptr_tag)
|
||||
{
|
||||
if (op == clone_functor_tag)
|
||||
@ -307,13 +277,13 @@ namespace boost {
|
||||
public: // should be protected, but GCC 2.95.3 will fail to allow access
|
||||
detail::function::any_pointer (*manager)(
|
||||
detail::function::any_pointer,
|
||||
detail::function::functor_manager_operation_type);
|
||||
detail::function::any_pointer functor;
|
||||
|
||||
#if (defined __SUNPRO_CC) && (__SUNPRO_CC <= 0x530) && !(defined BOOST_NO_COMPILER_CONFIG)
|
||||
// Sun C++ 5.3 can't handle the safe_bool idiom, so don't use it
|
||||
operator bool () const { return !this->empty(); }
|
||||
#else
|
||||
detail::function::functor_manager_operation_type);
|
||||
detail::function::any_pointer functor;
|
||||
|
||||
private:
|
||||
struct dummy {
|
||||
void nonnull() {};
|
||||
@ -346,7 +316,7 @@ namespace boost {
|
||||
template<typename FunctionObj>
|
||||
inline bool has_empty_target(const FunctionObj&, truth<false>)
|
||||
{
|
||||
return false;
|
||||
return false;
|
||||
}
|
||||
|
||||
// The result is a Boost.Function object, so query whether it is empty
|
||||
@ -356,29 +326,20 @@ namespace boost {
|
||||
{
|
||||
return f.empty();
|
||||
}
|
||||
|
||||
template<typename Lock, typename Mixin>
|
||||
struct scoped_double_lock
|
||||
{
|
||||
scoped_double_lock(const Mixin& m1, const Mixin& m2) :
|
||||
lock1(&m1 < &m2? m1 : m2), lock2(!(&m1 < &m2)? m1 : m2)
|
||||
{
|
||||
}
|
||||
|
||||
Lock lock1;
|
||||
Lock lock2;
|
||||
};
|
||||
} // end namespace function
|
||||
} // end namespace detail
|
||||
|
||||
// The default function policy is to do nothing before and after the call.
|
||||
struct empty_function_policy
|
||||
{
|
||||
inline void precall(const function_base*) {}
|
||||
inline void postcall(const function_base*) {}
|
||||
};
|
||||
|
||||
// The default function mixin does nothing. The assignment and
|
||||
// copy-construction operators are all defined because MSVC defines broken
|
||||
// versions.
|
||||
struct empty_function_mixin
|
||||
{
|
||||
empty_function_mixin() {}
|
||||
empty_function_mixin(const empty_function_mixin&) {}
|
||||
|
||||
empty_function_mixin& operator=(const empty_function_mixin&)
|
||||
{
|
||||
return *this;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
#endif // BOOST_FUNCTION_BASE_HEADER
|
||||
|
@ -1,6 +1,6 @@
|
||||
// Boost.Function library
|
||||
|
||||
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
|
||||
// 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.
|
||||
@ -25,13 +25,6 @@
|
||||
# include <boost/mem_fn.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
|
||||
@ -229,15 +222,18 @@ namespace boost {
|
||||
template<
|
||||
typename R BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_PARMS,
|
||||
typename Policy = empty_function_policy,
|
||||
typename Mixin = empty_function_mixin,
|
||||
typename ThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||
typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||
>
|
||||
class BOOST_FUNCTION_FUNCTION : public function_base, public Mixin
|
||||
class BOOST_FUNCTION_FUNCTION : public function_base,
|
||||
public ThreadingPolicy::mixin
|
||||
{
|
||||
typedef typename detail::function::function_return_type<R>::type
|
||||
internal_result_type;
|
||||
|
||||
typedef typename ThreadingPolicy::mixin threading_mixin;
|
||||
typedef typename ThreadingPolicy::lock lock;
|
||||
|
||||
public:
|
||||
BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS);
|
||||
|
||||
@ -253,54 +249,48 @@ namespace boost {
|
||||
#else
|
||||
typedef internal_result_type result_type;
|
||||
#endif // BOOST_NO_VOID_RETURNS
|
||||
typedef Policy policy_type;
|
||||
typedef Mixin mixin_type;
|
||||
typedef Allocator allocator_type;
|
||||
typedef BOOST_FUNCTION_FUNCTION self_type;
|
||||
typedef ThreadingPolicy threading_policy_type;
|
||||
|
||||
BOOST_FUNCTION_FUNCTION() : function_base(), Mixin(), invoker(0) {}
|
||||
|
||||
explicit BOOST_FUNCTION_FUNCTION(const Mixin& m) :
|
||||
function_base(), Mixin(m), invoker(0)
|
||||
{
|
||||
}
|
||||
BOOST_FUNCTION_FUNCTION() : function_base(), invoker(0) {}
|
||||
|
||||
// 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(), Mixin(), invoker(0)
|
||||
{
|
||||
this->assign_to(f);
|
||||
}
|
||||
|
||||
template<typename Functor>
|
||||
BOOST_FUNCTION_FUNCTION(Functor f, const Mixin& m) :
|
||||
function_base(), Mixin(m), invoker(0)
|
||||
function_base(), invoker(0)
|
||||
{
|
||||
this->assign_to(f);
|
||||
}
|
||||
|
||||
BOOST_FUNCTION_FUNCTION(const BOOST_FUNCTION_FUNCTION& f) :
|
||||
function_base(), Mixin(static_cast<const Mixin&>(f)), invoker(0)
|
||||
function_base(), invoker(0)
|
||||
{
|
||||
// Lock the other function object so it can't change during assignment
|
||||
lock l(static_cast<const self_type&>(f));
|
||||
(void)l;
|
||||
this->assign_to_own(f);
|
||||
}
|
||||
|
||||
~BOOST_FUNCTION_FUNCTION() { clear(); }
|
||||
~BOOST_FUNCTION_FUNCTION()
|
||||
{
|
||||
lock l(static_cast<const threading_mixin&>(*this));
|
||||
(void)l;
|
||||
clear();
|
||||
}
|
||||
|
||||
result_type operator()(BOOST_FUNCTION_PARMS) const
|
||||
{
|
||||
// Make sure this function can't change while it is being invoked
|
||||
lock l(static_cast<const threading_mixin&>(*this));
|
||||
(void)l;
|
||||
assert(!this->empty());
|
||||
|
||||
policy_type policy;
|
||||
policy.precall(this);
|
||||
|
||||
internal_result_type result = invoker(function_base::functor
|
||||
BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_ARGS);
|
||||
|
||||
policy.postcall(this);
|
||||
#ifndef BOOST_NO_VOID_RETURNS
|
||||
return static_cast<result_type>(result);
|
||||
#else
|
||||
@ -317,49 +307,45 @@ namespace boost {
|
||||
BOOST_FUNCTION_FUNCTION&
|
||||
operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
||||
{
|
||||
self_type(f, static_cast<const Mixin&>(*this)).swap(*this);
|
||||
self_type other(f);
|
||||
lock l(static_cast<const threading_mixin&>(*this));
|
||||
(void)l;
|
||||
other.unlocked_swap(*this);
|
||||
return *this;
|
||||
}
|
||||
|
||||
template<typename Functor>
|
||||
void set(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
||||
{
|
||||
self_type(f, static_cast<const Mixin&>(*this)).swap(*this);
|
||||
}
|
||||
|
||||
// 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);
|
||||
self_type other(f);
|
||||
lock l(static_cast<const threading_mixin&>(*this));
|
||||
(void)l;
|
||||
other.unlocked_swap(*this);
|
||||
|
||||
return *this;
|
||||
}
|
||||
|
||||
// Assignment from another BOOST_FUNCTION_FUNCTION
|
||||
void set(const BOOST_FUNCTION_FUNCTION& f)
|
||||
{
|
||||
if (&f == this)
|
||||
return;
|
||||
|
||||
self_type(f).swap(*this);
|
||||
}
|
||||
|
||||
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);
|
||||
std::swap(static_cast<Mixin&>(*this), static_cast<Mixin&>(other));
|
||||
detail::function::scoped_double_lock<lock, threading_mixin> l(*this,
|
||||
other);
|
||||
(void)l;
|
||||
|
||||
unlocked_swap(other);
|
||||
}
|
||||
|
||||
// Clear out a target, if there is one
|
||||
void clear()
|
||||
{
|
||||
lock l(static_cast<const threading_mixin&>(*this));
|
||||
(void)l;
|
||||
|
||||
if (function_base::manager) {
|
||||
function_base::functor =
|
||||
function_base::manager(function_base::functor,
|
||||
@ -378,7 +364,7 @@ namespace boost {
|
||||
function_base::manager = f.manager;
|
||||
function_base::functor =
|
||||
f.manager(f.functor, detail::function::clone_functor_tag);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
template<typename Functor>
|
||||
@ -502,6 +488,13 @@ namespace boost {
|
||||
function_base::functor = detail::function::any_pointer(this);
|
||||
}
|
||||
|
||||
void unlocked_swap(BOOST_FUNCTION_FUNCTION& other)
|
||||
{
|
||||
std::swap(function_base::manager, other.manager);
|
||||
std::swap(function_base::functor, other.functor);
|
||||
std::swap(invoker, other.invoker);
|
||||
}
|
||||
|
||||
typedef internal_result_type (*invoker_type)(detail::function::any_pointer
|
||||
BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_ARGS);
|
||||
@ -510,19 +503,17 @@ namespace boost {
|
||||
};
|
||||
|
||||
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS ,
|
||||
typename Policy, typename Mixin, typename Allocator>
|
||||
typename ThreadingPolicy, typename Allocator>
|
||||
inline void swap(BOOST_FUNCTION_FUNCTION<
|
||||
R BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_ARGS ,
|
||||
Policy,
|
||||
Mixin,
|
||||
ThreadingPolicy,
|
||||
Allocator
|
||||
>& f1,
|
||||
BOOST_FUNCTION_FUNCTION<
|
||||
R BOOST_FUNCTION_COMMA
|
||||
BOOST_FUNCTION_TEMPLATE_ARGS,
|
||||
Policy,
|
||||
Mixin,
|
||||
ThreadingPolicy,
|
||||
Allocator
|
||||
>& f2)
|
||||
{
|
||||
@ -531,7 +522,6 @@ namespace boost {
|
||||
}
|
||||
|
||||
// Cleanup after ourselves...
|
||||
#undef BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||
#undef BOOST_FUNCTION_COMMA
|
||||
#undef BOOST_FUNCTION_FUNCTION
|
||||
#undef BOOST_FUNCTION_FUNCTION_INVOKER
|
||||
|
48
include/boost/function/threading/detail/mutex_mixin.hpp
Normal file
48
include/boost/function/threading/detail/mutex_mixin.hpp
Normal file
@ -0,0 +1,48 @@
|
||||
// Copyright (C) 2002
|
||||
// Doug Gregor (gregod@cs.rpi.edu)
|
||||
//
|
||||
// Permission to use, copy, modify, distribute and sell this software
|
||||
// and its documentation for any purpose is hereby granted without fee,
|
||||
// provided that the above copyright notice appear in all copies and
|
||||
// that both that copyright notice and this permission notice appear
|
||||
// in supporting documentation. William E. Kempf makes no representations
|
||||
// about the suitability of this software for any purpose.
|
||||
// It is provided "as is" without express or implied warranty.
|
||||
#ifndef BOOST_THREAD_MODEL_DETAIL_MUTEX_MIXIN_HPP
|
||||
#define BOOST_THREAD_MODEL_DETAIL_MUTEX_MIXIN_HPP
|
||||
|
||||
namespace boost {
|
||||
namespace detail {
|
||||
|
||||
template<typename Mutex>
|
||||
class mutex_mixin
|
||||
{
|
||||
public:
|
||||
mutex_mixin(const mutex_mixin&) {}
|
||||
mutex_mixin& operator=(const mutex_mixin&) { return *this; }
|
||||
|
||||
operator const Mutex&() const { return mutex; }
|
||||
operator Mutex&() { return mutex; }
|
||||
|
||||
private:
|
||||
Mutex mutex;
|
||||
};
|
||||
|
||||
template<typename Mutex>
|
||||
class static_mutex_mixin
|
||||
{
|
||||
public:
|
||||
static_mutex_mixin(const mutex_mixin&) {}
|
||||
static_mutex_mixin& operator=(const mutex_mixin&) { return *this; }
|
||||
|
||||
operator const Mutex&() const { return mutex; }
|
||||
operator Mutex&() { return mutex; }
|
||||
|
||||
private:
|
||||
static Mutex mutex;
|
||||
};
|
||||
|
||||
} // end namespace detail
|
||||
} // end namespace boost
|
||||
|
||||
#endif // BOOST_THREAD_MODEL_DETAIL_MUTEX_MIXIN_HPP
|
28
include/boost/function/threading/per_class.hpp
Normal file
28
include/boost/function/threading/per_class.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright (C) 2002
|
||||
// Doug Gregor (gregod@cs.rpi.edu)
|
||||
//
|
||||
// Permission to use, copy, modify, distribute and sell this software
|
||||
// and its documentation for any purpose is hereby granted without fee,
|
||||
// provided that the above copyright notice appear in all copies and
|
||||
// that both that copyright notice and this permission notice appear
|
||||
// in supporting documentation. William E. Kempf makes no representations
|
||||
// about the suitability of this software for any purpose.
|
||||
// It is provided "as is" without express or implied warranty.
|
||||
#ifndef BOOST_THREAD_MODEL_PER_CLASS_HPP
|
||||
#define BOOST_THREAD_MODEL_PER_CLASS_HPP
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/thread/model/detail/mutex_mixin.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
template<typename Mutex = boost::mutex>
|
||||
struct per_class_locking
|
||||
{
|
||||
typedef detail::static_mutex_mixin<Mutex> mixin;
|
||||
typedef typename Mutex::scoped_lock lock;
|
||||
};
|
||||
|
||||
} // end namespace boost
|
||||
|
||||
#endif // BOOST_THREAD_MODEL_PER_CLASS_HPP
|
28
include/boost/function/threading/per_object.hpp
Normal file
28
include/boost/function/threading/per_object.hpp
Normal file
@ -0,0 +1,28 @@
|
||||
// Copyright (C) 2002
|
||||
// Doug Gregor (gregod@cs.rpi.edu)
|
||||
//
|
||||
// Permission to use, copy, modify, distribute and sell this software
|
||||
// and its documentation for any purpose is hereby granted without fee,
|
||||
// provided that the above copyright notice appear in all copies and
|
||||
// that both that copyright notice and this permission notice appear
|
||||
// in supporting documentation. William E. Kempf makes no representations
|
||||
// about the suitability of this software for any purpose.
|
||||
// It is provided "as is" without express or implied warranty.
|
||||
#ifndef BOOST_THREAD_MODEL_PER_OBJECT_HPP
|
||||
#define BOOST_THREAD_MODEL_PER_OBJECT_HPP
|
||||
|
||||
#include <boost/thread/mutex.hpp>
|
||||
#include <boost/thread/model/detail/mutex_mixin.hpp>
|
||||
|
||||
namespace boost {
|
||||
|
||||
template<typename Mutex = boost::mutex>
|
||||
struct per_object_locking
|
||||
{
|
||||
typedef detail::mutex_mixin<Mutex> mixin;
|
||||
typedef typename Mutex::scoped_lock lock;
|
||||
};
|
||||
|
||||
} // end namespace boost
|
||||
|
||||
#endif // BOOST_THREAD_MODEL_PER_OBJECT_HPP
|
27
include/boost/function/threading/single.hpp
Normal file
27
include/boost/function/threading/single.hpp
Normal file
@ -0,0 +1,27 @@
|
||||
// Copyright (C) 2002
|
||||
// Doug Gregor (gregod@cs.rpi.edu)
|
||||
//
|
||||
// Permission to use, copy, modify, distribute and sell this software
|
||||
// and its documentation for any purpose is hereby granted without fee,
|
||||
// provided that the above copyright notice appear in all copies and
|
||||
// that both that copyright notice and this permission notice appear
|
||||
// in supporting documentation. William E. Kempf makes no representations
|
||||
// about the suitability of this software for any purpose.
|
||||
// It is provided "as is" without express or implied warranty.
|
||||
#ifndef BOOST_THREAD_MODEL_SINGLE_HPP
|
||||
#define BOOST_THREAD_MODEL_SINGLE_HPP
|
||||
|
||||
namespace boost {
|
||||
|
||||
struct single_threaded {
|
||||
struct mixin {};
|
||||
|
||||
struct lock
|
||||
{
|
||||
lock(const mixin&) {}
|
||||
};
|
||||
};
|
||||
|
||||
} // end namespace boost
|
||||
|
||||
#endif // BOOST_THREAD_MODEL_SINGLE_HPP
|
@ -1,6 +1,6 @@
|
||||
// Boost.Function library
|
||||
|
||||
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
|
||||
// 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.
|
||||
@ -93,7 +93,7 @@ test_zero_args()
|
||||
|
||||
// Invocation and self-assignment
|
||||
global_int = 0;
|
||||
v1.set(v1);
|
||||
v1 = (v1);
|
||||
v1();
|
||||
BOOST_TEST(global_int == 5);
|
||||
|
||||
@ -152,7 +152,7 @@ test_zero_args()
|
||||
BOOST_TEST(global_int == 3);
|
||||
|
||||
// Assignment to a non-empty function
|
||||
v2.set(five);
|
||||
v2 = (five);
|
||||
|
||||
// Invocation
|
||||
global_int = 0;
|
||||
@ -163,7 +163,7 @@ test_zero_args()
|
||||
BOOST_TEST(v2.empty());
|
||||
|
||||
// Assignment to an empty function from a free function
|
||||
v2.set(&write_five);
|
||||
v2 = (&write_five);
|
||||
BOOST_TEST(v2);
|
||||
|
||||
// Invocation
|
||||
|
@ -1,6 +1,6 @@
|
||||
// Boost.Function library
|
||||
|
||||
// Copyright (C) 2001 Doug Gregor (gregod@cs.rpi.edu)
|
||||
// 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.
|
||||
@ -93,7 +93,7 @@ test_zero_args()
|
||||
|
||||
// Invocation and self-assignment
|
||||
global_int = 0;
|
||||
v1.set(v1);
|
||||
v1 = (v1);
|
||||
v1();
|
||||
BOOST_TEST(global_int == 5);
|
||||
|
||||
@ -152,7 +152,7 @@ test_zero_args()
|
||||
BOOST_TEST(global_int == 3);
|
||||
|
||||
// Assignment to a non-empty function
|
||||
v2.set(five);
|
||||
v2 = (five);
|
||||
|
||||
// Invocation
|
||||
global_int = 0;
|
||||
@ -163,7 +163,7 @@ test_zero_args()
|
||||
BOOST_TEST(v2.empty());
|
||||
|
||||
// Assignment to an empty function from a free function
|
||||
v2.set(BOOST_FUNCTION_TARGET_FIX(&) write_five);
|
||||
v2 = (BOOST_FUNCTION_TARGET_FIX(&) write_five);
|
||||
BOOST_TEST(v2);
|
||||
|
||||
// Invocation
|
||||
|
@ -1,60 +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
|
||||
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
#include <cassert>
|
||||
#include <functional>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
struct id_mixin
|
||||
{
|
||||
id_mixin(const id_mixin& rhs) : id(rhs.id) {}
|
||||
id_mixin& operator=(const id_mixin& rhs){id = rhs.id; return *this;}
|
||||
id_mixin(int i = 0){ id = i;}
|
||||
int id;
|
||||
};
|
||||
|
||||
static int do_plus(int x, int y) { return x+y; }
|
||||
|
||||
typedef boost::function<int,int,int>::mixin<id_mixin>::type func;
|
||||
|
||||
int test_main(int, char*[])
|
||||
{
|
||||
func f(id_mixin(3));
|
||||
f = std::plus<int>();
|
||||
BOOST_TEST(f.id == 3);
|
||||
|
||||
f = &do_plus;
|
||||
BOOST_TEST(f.id == 3);
|
||||
|
||||
f.clear();
|
||||
f.id = 7;
|
||||
BOOST_TEST(f.id == 7);
|
||||
|
||||
func g(f);
|
||||
BOOST_TEST(g.id == 7);
|
||||
|
||||
f.id = 21;
|
||||
BOOST_TEST(f.id == 21);
|
||||
|
||||
boost::swap(f,g);
|
||||
BOOST_TEST(f.id == 7);
|
||||
BOOST_TEST(g.id == 21);
|
||||
|
||||
g = f;
|
||||
BOOST_TEST(g.id == 7);
|
||||
return 0;
|
||||
}
|
@ -1,47 +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
|
||||
|
||||
#define BOOST_INCLUDE_MAIN
|
||||
#include <boost/test/test_tools.hpp>
|
||||
#include <cassert>
|
||||
#include <iostream>
|
||||
#include <functional>
|
||||
#include <boost/function.hpp>
|
||||
|
||||
using namespace std;
|
||||
using namespace boost;
|
||||
|
||||
struct counting_policy
|
||||
{
|
||||
static int count;
|
||||
|
||||
void precall(const function_base*) { count++; }
|
||||
void postcall(const function_base*) { count+=2; }
|
||||
};
|
||||
|
||||
int counting_policy::count = 0;
|
||||
|
||||
int
|
||||
test_main(int, char*[])
|
||||
{
|
||||
function<int, int, int>::policy<counting_policy>::type f;
|
||||
|
||||
f = plus<int>();
|
||||
|
||||
BOOST_TEST(5 == f(2,3));
|
||||
BOOST_TEST(counting_policy::count==3);
|
||||
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user