forked from boostorg/function
Compare commits
4 Commits
svn-branch
...
svn-branch
Author | SHA1 | Date | |
---|---|---|---|
5d7f4aae46 | |||
9a4d7447a7 | |||
83481662bb | |||
64b6e85a94 |
@ -1,6 +1,6 @@
|
|||||||
// Boost.Function library
|
// 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
|
// Permission to copy, use, sell and distribute this software is granted
|
||||||
// provided this copyright notice appears in all copies.
|
// provided this copyright notice appears in all copies.
|
||||||
@ -53,13 +53,12 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
struct params
|
||||||
{
|
{
|
||||||
typedef function0<R, Policy, Mixin, Allocator> type;
|
typedef function0<R, ThreadingPolicy, Allocator> type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -78,13 +77,12 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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 T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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 T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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 T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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 T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
struct params
|
||||||
{
|
{
|
||||||
typedef function5<R, T1, T2, T3, T4, T5, Policy, Mixin, Allocator>
|
typedef function5<R, T1, T2, T3, T4, T5, ThreadingPolicy, Allocator>
|
||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -204,13 +198,12 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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;
|
type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -230,13 +223,12 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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;
|
Allocator> type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -256,13 +248,12 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
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;
|
Allocator> type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -282,14 +273,13 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
struct params
|
||||||
{
|
{
|
||||||
typedef function9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, Policy,
|
typedef function9<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||||
Mixin, Allocator> type;
|
ThreadingPolicy, Allocator> type;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -308,14 +298,13 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy,
|
typename ThreadingPolicy,
|
||||||
typename Mixin,
|
|
||||||
typename Allocator
|
typename Allocator
|
||||||
>
|
>
|
||||||
struct params
|
struct params
|
||||||
{
|
{
|
||||||
typedef function10<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
|
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 T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename Policy = empty_function_policy,
|
typename ThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||||
typename Mixin = empty_function_mixin,
|
typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||||
typename Allocator = std::allocator<function_base>
|
|
||||||
>
|
>
|
||||||
struct get_function_impl
|
struct get_function_impl
|
||||||
{
|
{
|
||||||
typedef typename real_get_function_impl<
|
typedef typename real_get_function_impl<
|
||||||
(count_used_args<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value)
|
(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,
|
>::template params<R, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10,
|
||||||
Policy, Mixin, Allocator>::type
|
ThreadingPolicy, Allocator>::type
|
||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -356,55 +344,37 @@ namespace boost {
|
|||||||
typename T8,
|
typename T8,
|
||||||
typename T9,
|
typename T9,
|
||||||
typename T10,
|
typename T10,
|
||||||
typename MyPolicy = empty_function_policy,
|
typename MyThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||||
typename MyMixin = empty_function_mixin,
|
typename MyAllocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
||||||
typename MyAllocator = std::allocator<function_base>
|
|
||||||
>
|
>
|
||||||
struct function_traits_builder
|
struct function_traits_builder
|
||||||
{
|
{
|
||||||
typedef typename get_function_impl<R, T1, T2, T3, T4, T5, T6, T7,
|
typedef typename get_function_impl<R, T1, T2, T3, T4, T5, T6, T7,
|
||||||
T8, T9, T10, MyPolicy, MyMixin,
|
T8, T9, T10, MyThreadingPolicy,
|
||||||
MyAllocator>::type
|
MyAllocator>::type
|
||||||
type;
|
type;
|
||||||
|
|
||||||
typedef MyPolicy policy_type;
|
typedef MyThreadingPolicy threading_policy_type;
|
||||||
typedef MyMixin mixin_type;
|
|
||||||
typedef MyAllocator allocator_type;
|
typedef MyAllocator allocator_type;
|
||||||
|
|
||||||
#ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
|
#ifndef BOOST_NO_DEPENDENT_NESTED_DERIVATIONS
|
||||||
template<typename Policy>
|
template<typename ThreadingPolicy>
|
||||||
struct policy :
|
struct threading_policy :
|
||||||
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||||
T10, Policy, mixin_type,
|
T10, ThreadingPolicy,
|
||||||
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,
|
|
||||||
allocator_type> {};
|
allocator_type> {};
|
||||||
|
|
||||||
template<typename Allocator>
|
template<typename Allocator>
|
||||||
struct allocator :
|
struct allocator :
|
||||||
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
public function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7, T8, T9,
|
||||||
T10, policy_type, mixin_type,
|
T10, threading_policy_type,
|
||||||
Allocator> {};
|
Allocator> {};
|
||||||
#else
|
#else
|
||||||
template<typename Policy>
|
template<typename ThreadingPolicy>
|
||||||
struct policy
|
struct threading_policy
|
||||||
{
|
{
|
||||||
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
||||||
T8, T9, T10, Policy,
|
T8, T9, T10, ThreadingPolicy,
|
||||||
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,
|
|
||||||
allocator_type>::type
|
allocator_type>::type
|
||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
@ -413,8 +383,9 @@ namespace boost {
|
|||||||
struct allocator
|
struct allocator
|
||||||
{
|
{
|
||||||
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
typedef typename function_traits_builder<R, T1, T2, T3, T4, T5, T6, T7,
|
||||||
T8, T9, T10, policy_type,
|
T8, T9, T10,
|
||||||
mixin_type, Allocator>::type
|
threading_policy_type,
|
||||||
|
Allocator>::type
|
||||||
type;
|
type;
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
@ -448,8 +419,7 @@ namespace boost {
|
|||||||
base_type;
|
base_type;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
typedef typename base_type::policy_type policy_type;
|
typedef typename base_type::threading_policy_type policy_type;
|
||||||
typedef typename base_type::mixin_type mixin_type;
|
|
||||||
typedef typename base_type::allocator_type allocator_type;
|
typedef typename base_type::allocator_type allocator_type;
|
||||||
typedef function self_type;
|
typedef function self_type;
|
||||||
|
|
||||||
@ -463,37 +433,21 @@ namespace boost {
|
|||||||
template<typename Functor>
|
template<typename Functor>
|
||||||
self_type& operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
self_type& operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
||||||
{
|
{
|
||||||
self_type(f).swap(*this);
|
base_type::operator=(f);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
self_type& operator=(const base_type& f)
|
self_type& operator=(const base_type& f)
|
||||||
{
|
{
|
||||||
self_type(f).swap(*this);
|
base_type::operator=(f);
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
self_type& operator=(const self_type& f)
|
self_type& operator=(const self_type& f)
|
||||||
{
|
{
|
||||||
self_type(f).swap(*this);
|
base_type::operator=(static_cast<const base_type&>(f));
|
||||||
return *this;
|
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,
|
template<typename R,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Boost.Function library
|
// 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
|
// Permission to copy, use, sell and distribute this software is granted
|
||||||
// provided this copyright notice appears in all copies.
|
// provided this copyright notice appears in all copies.
|
||||||
@ -24,6 +24,8 @@
|
|||||||
#include <boost/config.hpp>
|
#include <boost/config.hpp>
|
||||||
#include <boost/type_traits.hpp>
|
#include <boost/type_traits.hpp>
|
||||||
#include <boost/ref.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
|
#if defined(BOOST_MSVC) && BOOST_MSVC <= 1300 || defined(__ICL) && __ICL <= 600 || defined(__MWERKS__) && __MWERKS__ < 0x2406
|
||||||
# define BOOST_FUNCTION_TARGET_FIX(x) x
|
# define BOOST_FUNCTION_TARGET_FIX(x) x
|
||||||
@ -31,54 +33,22 @@
|
|||||||
# define BOOST_FUNCTION_TARGET_FIX(x)
|
# define BOOST_FUNCTION_TARGET_FIX(x)
|
||||||
#endif // not MSVC
|
#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 boost {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
namespace function {
|
namespace function {
|
||||||
template<bool> struct truth {};
|
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
|
* 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
|
* 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
|
// The trivial manager does nothing but return the same pointer (if we
|
||||||
// are cloning) or return the null pointer (if we are deleting).
|
// are cloning) or return the null pointer (if we are deleting).
|
||||||
inline any_pointer trivial_manager(any_pointer f,
|
inline any_pointer trivial_manager(any_pointer f,
|
||||||
functor_manager_operation_type op)
|
functor_manager_operation_type op)
|
||||||
{
|
{
|
||||||
if (op == clone_functor_tag)
|
if (op == clone_functor_tag)
|
||||||
return f;
|
return f;
|
||||||
@ -179,7 +149,7 @@ namespace boost {
|
|||||||
// For function pointers, the manager is trivial
|
// For function pointers, the manager is trivial
|
||||||
static inline any_pointer
|
static inline any_pointer
|
||||||
manager(any_pointer function_ptr,
|
manager(any_pointer function_ptr,
|
||||||
functor_manager_operation_type op,
|
functor_manager_operation_type op,
|
||||||
function_ptr_tag)
|
function_ptr_tag)
|
||||||
{
|
{
|
||||||
if (op == clone_functor_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
|
public: // should be protected, but GCC 2.95.3 will fail to allow access
|
||||||
detail::function::any_pointer (*manager)(
|
detail::function::any_pointer (*manager)(
|
||||||
detail::function::any_pointer,
|
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)
|
#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
|
// Sun C++ 5.3 can't handle the safe_bool idiom, so don't use it
|
||||||
operator bool () const { return !this->empty(); }
|
operator bool () const { return !this->empty(); }
|
||||||
#else
|
#else
|
||||||
detail::function::functor_manager_operation_type);
|
|
||||||
detail::function::any_pointer functor;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct dummy {
|
struct dummy {
|
||||||
void nonnull() {};
|
void nonnull() {};
|
||||||
@ -346,7 +316,7 @@ namespace boost {
|
|||||||
template<typename FunctionObj>
|
template<typename FunctionObj>
|
||||||
inline bool has_empty_target(const FunctionObj&, truth<false>)
|
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
|
// The result is a Boost.Function object, so query whether it is empty
|
||||||
@ -356,29 +326,20 @@ namespace boost {
|
|||||||
{
|
{
|
||||||
return f.empty();
|
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 function
|
||||||
} // end namespace detail
|
} // 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
|
#endif // BOOST_FUNCTION_BASE_HEADER
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Boost.Function library
|
// 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
|
// Permission to copy, use, sell and distribute this software is granted
|
||||||
// provided this copyright notice appears in all copies.
|
// provided this copyright notice appears in all copies.
|
||||||
@ -25,13 +25,6 @@
|
|||||||
# include <boost/mem_fn.hpp>
|
# include <boost/mem_fn.hpp>
|
||||||
#endif // BOOST_FUNCTION_FUNCTION_TEMPLATE_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
|
// Comma if nonzero number of arguments
|
||||||
#if BOOST_FUNCTION_NUM_ARGS == 0
|
#if BOOST_FUNCTION_NUM_ARGS == 0
|
||||||
# define BOOST_FUNCTION_COMMA
|
# define BOOST_FUNCTION_COMMA
|
||||||
@ -229,15 +222,18 @@ namespace boost {
|
|||||||
template<
|
template<
|
||||||
typename R BOOST_FUNCTION_COMMA
|
typename R BOOST_FUNCTION_COMMA
|
||||||
BOOST_FUNCTION_TEMPLATE_PARMS,
|
BOOST_FUNCTION_TEMPLATE_PARMS,
|
||||||
typename Policy = empty_function_policy,
|
typename ThreadingPolicy = BOOST_FUNCTION_DEFAULT_THREADING_POLICY,
|
||||||
typename Mixin = empty_function_mixin,
|
|
||||||
typename Allocator = BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
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
|
typedef typename detail::function::function_return_type<R>::type
|
||||||
internal_result_type;
|
internal_result_type;
|
||||||
|
|
||||||
|
typedef typename ThreadingPolicy::mixin threading_mixin;
|
||||||
|
typedef typename ThreadingPolicy::lock lock;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS);
|
BOOST_STATIC_CONSTANT(int, args = BOOST_FUNCTION_NUM_ARGS);
|
||||||
|
|
||||||
@ -253,54 +249,48 @@ namespace boost {
|
|||||||
#else
|
#else
|
||||||
typedef internal_result_type result_type;
|
typedef internal_result_type result_type;
|
||||||
#endif // BOOST_NO_VOID_RETURNS
|
#endif // BOOST_NO_VOID_RETURNS
|
||||||
typedef Policy policy_type;
|
|
||||||
typedef Mixin mixin_type;
|
|
||||||
typedef Allocator allocator_type;
|
typedef Allocator allocator_type;
|
||||||
typedef BOOST_FUNCTION_FUNCTION self_type;
|
typedef BOOST_FUNCTION_FUNCTION self_type;
|
||||||
|
typedef ThreadingPolicy threading_policy_type;
|
||||||
|
|
||||||
BOOST_FUNCTION_FUNCTION() : function_base(), Mixin(), invoker(0) {}
|
BOOST_FUNCTION_FUNCTION() : function_base(), invoker(0) {}
|
||||||
|
|
||||||
explicit BOOST_FUNCTION_FUNCTION(const Mixin& m) :
|
|
||||||
function_base(), Mixin(m), invoker(0)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// MSVC chokes if the following two constructors are collapsed into
|
// MSVC chokes if the following two constructors are collapsed into
|
||||||
// one with a default parameter.
|
// one with a default parameter.
|
||||||
template<typename Functor>
|
template<typename Functor>
|
||||||
BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f) :
|
BOOST_FUNCTION_FUNCTION(Functor BOOST_FUNCTION_TARGET_FIX(const &) f) :
|
||||||
function_base(), Mixin(), invoker(0)
|
function_base(), invoker(0)
|
||||||
{
|
|
||||||
this->assign_to(f);
|
|
||||||
}
|
|
||||||
|
|
||||||
template<typename Functor>
|
|
||||||
BOOST_FUNCTION_FUNCTION(Functor f, const Mixin& m) :
|
|
||||||
function_base(), Mixin(m), invoker(0)
|
|
||||||
{
|
{
|
||||||
this->assign_to(f);
|
this->assign_to(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
BOOST_FUNCTION_FUNCTION(const BOOST_FUNCTION_FUNCTION& 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);
|
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
|
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());
|
assert(!this->empty());
|
||||||
|
|
||||||
policy_type policy;
|
|
||||||
policy.precall(this);
|
|
||||||
|
|
||||||
internal_result_type result = invoker(function_base::functor
|
internal_result_type result = invoker(function_base::functor
|
||||||
BOOST_FUNCTION_COMMA
|
BOOST_FUNCTION_COMMA
|
||||||
BOOST_FUNCTION_ARGS);
|
BOOST_FUNCTION_ARGS);
|
||||||
|
|
||||||
policy.postcall(this);
|
|
||||||
#ifndef BOOST_NO_VOID_RETURNS
|
#ifndef BOOST_NO_VOID_RETURNS
|
||||||
return static_cast<result_type>(result);
|
return static_cast<result_type>(result);
|
||||||
#else
|
#else
|
||||||
@ -317,49 +307,45 @@ namespace boost {
|
|||||||
BOOST_FUNCTION_FUNCTION&
|
BOOST_FUNCTION_FUNCTION&
|
||||||
operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
|
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;
|
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
|
// Assignment from another BOOST_FUNCTION_FUNCTION
|
||||||
BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f)
|
BOOST_FUNCTION_FUNCTION& operator=(const BOOST_FUNCTION_FUNCTION& f)
|
||||||
{
|
{
|
||||||
if (&f == this)
|
if (&f == this)
|
||||||
return *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;
|
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)
|
void swap(BOOST_FUNCTION_FUNCTION& other)
|
||||||
{
|
{
|
||||||
if (&other == this)
|
if (&other == this)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::swap(function_base::manager, other.manager);
|
detail::function::scoped_double_lock<lock, threading_mixin> l(*this,
|
||||||
std::swap(function_base::functor, other.functor);
|
other);
|
||||||
std::swap(invoker, other.invoker);
|
(void)l;
|
||||||
std::swap(static_cast<Mixin&>(*this), static_cast<Mixin&>(other));
|
|
||||||
|
unlocked_swap(other);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Clear out a target, if there is one
|
// Clear out a target, if there is one
|
||||||
void clear()
|
void clear()
|
||||||
{
|
{
|
||||||
|
lock l(static_cast<const threading_mixin&>(*this));
|
||||||
|
(void)l;
|
||||||
|
|
||||||
if (function_base::manager) {
|
if (function_base::manager) {
|
||||||
function_base::functor =
|
function_base::functor =
|
||||||
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::manager = f.manager;
|
||||||
function_base::functor =
|
function_base::functor =
|
||||||
f.manager(f.functor, detail::function::clone_functor_tag);
|
f.manager(f.functor, detail::function::clone_functor_tag);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Functor>
|
template<typename Functor>
|
||||||
@ -502,6 +488,13 @@ namespace boost {
|
|||||||
function_base::functor = detail::function::any_pointer(this);
|
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
|
typedef internal_result_type (*invoker_type)(detail::function::any_pointer
|
||||||
BOOST_FUNCTION_COMMA
|
BOOST_FUNCTION_COMMA
|
||||||
BOOST_FUNCTION_TEMPLATE_ARGS);
|
BOOST_FUNCTION_TEMPLATE_ARGS);
|
||||||
@ -510,19 +503,17 @@ namespace boost {
|
|||||||
};
|
};
|
||||||
|
|
||||||
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS ,
|
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<
|
inline void swap(BOOST_FUNCTION_FUNCTION<
|
||||||
R BOOST_FUNCTION_COMMA
|
R BOOST_FUNCTION_COMMA
|
||||||
BOOST_FUNCTION_TEMPLATE_ARGS ,
|
BOOST_FUNCTION_TEMPLATE_ARGS ,
|
||||||
Policy,
|
ThreadingPolicy,
|
||||||
Mixin,
|
|
||||||
Allocator
|
Allocator
|
||||||
>& f1,
|
>& f1,
|
||||||
BOOST_FUNCTION_FUNCTION<
|
BOOST_FUNCTION_FUNCTION<
|
||||||
R BOOST_FUNCTION_COMMA
|
R BOOST_FUNCTION_COMMA
|
||||||
BOOST_FUNCTION_TEMPLATE_ARGS,
|
BOOST_FUNCTION_TEMPLATE_ARGS,
|
||||||
Policy,
|
ThreadingPolicy,
|
||||||
Mixin,
|
|
||||||
Allocator
|
Allocator
|
||||||
>& f2)
|
>& f2)
|
||||||
{
|
{
|
||||||
@ -531,7 +522,6 @@ namespace boost {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Cleanup after ourselves...
|
// Cleanup after ourselves...
|
||||||
#undef BOOST_FUNCTION_DEFAULT_ALLOCATOR
|
|
||||||
#undef BOOST_FUNCTION_COMMA
|
#undef BOOST_FUNCTION_COMMA
|
||||||
#undef BOOST_FUNCTION_FUNCTION
|
#undef BOOST_FUNCTION_FUNCTION
|
||||||
#undef BOOST_FUNCTION_FUNCTION_INVOKER
|
#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
|
// 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
|
// Permission to copy, use, sell and distribute this software is granted
|
||||||
// provided this copyright notice appears in all copies.
|
// provided this copyright notice appears in all copies.
|
||||||
@ -93,7 +93,7 @@ test_zero_args()
|
|||||||
|
|
||||||
// Invocation and self-assignment
|
// Invocation and self-assignment
|
||||||
global_int = 0;
|
global_int = 0;
|
||||||
v1.set(v1);
|
v1 = (v1);
|
||||||
v1();
|
v1();
|
||||||
BOOST_TEST(global_int == 5);
|
BOOST_TEST(global_int == 5);
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ test_zero_args()
|
|||||||
BOOST_TEST(global_int == 3);
|
BOOST_TEST(global_int == 3);
|
||||||
|
|
||||||
// Assignment to a non-empty function
|
// Assignment to a non-empty function
|
||||||
v2.set(five);
|
v2 = (five);
|
||||||
|
|
||||||
// Invocation
|
// Invocation
|
||||||
global_int = 0;
|
global_int = 0;
|
||||||
@ -163,7 +163,7 @@ test_zero_args()
|
|||||||
BOOST_TEST(v2.empty());
|
BOOST_TEST(v2.empty());
|
||||||
|
|
||||||
// Assignment to an empty function from a free function
|
// Assignment to an empty function from a free function
|
||||||
v2.set(&write_five);
|
v2 = (&write_five);
|
||||||
BOOST_TEST(v2);
|
BOOST_TEST(v2);
|
||||||
|
|
||||||
// Invocation
|
// Invocation
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// Boost.Function library
|
// 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
|
// Permission to copy, use, sell and distribute this software is granted
|
||||||
// provided this copyright notice appears in all copies.
|
// provided this copyright notice appears in all copies.
|
||||||
@ -93,7 +93,7 @@ test_zero_args()
|
|||||||
|
|
||||||
// Invocation and self-assignment
|
// Invocation and self-assignment
|
||||||
global_int = 0;
|
global_int = 0;
|
||||||
v1.set(v1);
|
v1 = (v1);
|
||||||
v1();
|
v1();
|
||||||
BOOST_TEST(global_int == 5);
|
BOOST_TEST(global_int == 5);
|
||||||
|
|
||||||
@ -152,7 +152,7 @@ test_zero_args()
|
|||||||
BOOST_TEST(global_int == 3);
|
BOOST_TEST(global_int == 3);
|
||||||
|
|
||||||
// Assignment to a non-empty function
|
// Assignment to a non-empty function
|
||||||
v2.set(five);
|
v2 = (five);
|
||||||
|
|
||||||
// Invocation
|
// Invocation
|
||||||
global_int = 0;
|
global_int = 0;
|
||||||
@ -163,7 +163,7 @@ test_zero_args()
|
|||||||
BOOST_TEST(v2.empty());
|
BOOST_TEST(v2.empty());
|
||||||
|
|
||||||
// Assignment to an empty function from a free function
|
// 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);
|
BOOST_TEST(v2);
|
||||||
|
|
||||||
// Invocation
|
// 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