Compare commits

..

26 Commits

Author SHA1 Message Date
bd84f2a232 Release 1.46.0
[SVN r69125]
2011-02-21 18:42:22 +00:00
f85a3db133 Spirit: merging from trunk upto rev. 61489
[SVN r63640]
2010-07-04 22:38:38 +00:00
a0286a58c7 Merge documentation fixes.
* Use `doc/src/*.css` instead of `doc/html/*.css`.
* Remove wiki and people directories.
* Some documentation fixes.
* Left out `minimal.css` changes and boostbook changes because of clashes.


[SVN r63347]
2010-06-26 12:30:09 +00:00
1b6a5673cb Merge [58123], [58127], [58128] to release. Fixes #3666.
[SVN r58195]
2009-12-06 17:50:28 +00:00
24a7ce00a8 rm cmake from the release branch before it goes out broken. Policy dictates that you never commit to release, you commit to trunk and merge to release.
[SVN r56941]
2009-10-17 01:10:45 +00:00
c398dfceb3 Add basic copyright/license to keep cmake out of the inspection report
[SVN r55095]
2009-07-22 21:51:01 +00:00
a108a1cf26 Fix a typo.
Merged revisions 54909 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

[SVN r54912]
2009-07-12 16:13:35 +00:00
d68cc8a51c Merge various function changes from trunk.
Merged revisions 49571,50064,51743,51745,53722,54616-54619 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

........
  r49571 | noel_belcourt | 2008-11-03 18:37:49 +0000 (Mon, 03 Nov 2008) | 9 lines
  
  Both Sun and Pgi on Linux correctly put typeinfo into the std
  namespace, but function_base keys off the
  BOOST_NO_EXCEPTION_STD_NAMESPACE macro instead of the
  BOOST_NO_STD_TYPEINFO macro.  The attached patch changes
  function_base to use the typeinfo macro.  Because eVC 4.2 doesn't
  put typeinfo into the std namespace, I need to define
  BOOST_NO_STD_TYPEINFO only for this eVC version.
........
  r50064 | johnmaddock | 2008-12-02 10:10:46 +0000 (Tue, 02 Dec 2008) | 1 line
  
  Fix -Wundef warning and suspect usage of BOOST_STRICT_CONFIG.
........
  r51743 | dgregor | 2009-03-13 05:23:53 +0000 (Fri, 13 Mar 2009) | 11 lines
  
  Implement an optimization that David Abrahams and myself came up with,
  where Boost.Function uses a bit in the vtable pointer to indicate when
  the target function object has a trivial copy constructor, trivial
  destructor, and fits within the small object buffer. In this case, we
  just copy the bits of the function object rather than performing an
  indirect call to the manager.
  
  This results in a 60% speedup on a micro-benchmark that copies and
  calls such function objects repeatedly.
........
  r51745 | dgregor | 2009-03-13 05:49:02 +0000 (Fri, 13 Mar 2009) | 7 lines
  
  Make Boost.Function compile under BOOST_NO_EXCEPTIONS.
  
  Fixes #2499
  Fixes #2494
  Fixes #2469
  Fixes #2466
........
  r53722 | vladimir_prus | 2009-06-07 16:44:50 +0100 (Sun, 07 Jun 2009) | 4 lines
  
  Make Boost.Function compile with disabled exceptions.
  
  Closes #2900. Patch from Gabi Davar.
........
  r54616 | danieljames | 2009-07-03 23:20:26 +0100 (Fri, 03 Jul 2009) | 3 lines
  
  When copying boost::ref, copy even when the referenced function is empty. Fixes #2642
  
  Patch by Steven Watanabe
........
  r54617 | danieljames | 2009-07-03 23:20:52 +0100 (Fri, 03 Jul 2009) | 6 lines
  
  Add 'and later versions' to support info for GCC and Visual C++. Fixes #2847.
  
  I didn't explicitly specify the versions since no one's updating this
  list and it's highly unlikely that a future version will break this. The
  same could probably be done for the other compilers but I don't know
  them very well so I'm leaving them alone.
........
  r54618 | danieljames | 2009-07-03 23:21:40 +0100 (Fri, 03 Jul 2009) | 4 lines
  
  Fix Boost.Function unit tests for C++0x. Fixes #3012
  
  Based on a patch from Richard Webb. Changed a bit so that it also
  works for the Visual C++ 10 beta.
........
  r54619 | danieljames | 2009-07-03 23:22:03 +0100 (Fri, 03 Jul 2009) | 3 lines
  
  Work around Visual C++ copy constructor bug. Fixes #2929.
  
  Based on the patch by Steven Watanabe.
........


[SVN r54824]
2009-07-08 23:23:52 +00:00
cca7b35712 Add missing #pragma warning(pop) in Boost.Function.
Merged revisions 53694 via svnmerge from 
https://svn.boost.org/svn/boost/trunk

........
  r53694 | danieljames | 2009-06-06 16:31:47 +0100 (Sat, 06 Jun 2009) | 1 line
  
  Add missing #pragma warning(pop). Fixes #2767.
........


[SVN r54410]
2009-06-27 10:46:20 +00:00
9bb12ce87a Fixed almost all tab and min/max issues found by inspect tool
[SVN r53142]
2009-05-20 19:41:20 +00:00
467ae9613f Merge PDF build changes from Trunk.
[SVN r51417]
2009-02-23 18:39:32 +00:00
2fd383cd2e merge of cmake build files from trunk per beman
[SVN r50756]
2009-01-24 18:57:20 +00:00
587658b047 Merge Boost.Function fixes from trunk
[SVN r49361]
2008-10-16 13:21:50 +00:00
83309a36c7 Merge Boost.Function from the trunk
[SVN r47422]
2008-07-14 18:32:29 +00:00
bfdb5b161d Merged fixes for Function, Signals, and MPI from trunk. See #1499, see #1416, see #1486
[SVN r42031]
2007-12-14 14:48:14 +00:00
c4539395fe Full merge from trunk at revision 41356 of entire boost-root tree.
[SVN r41369]
2007-11-25 18:07:19 +00:00
6147e7ddcc Starting point for releases
[SVN r39706]
2007-10-05 14:25:06 +00:00
1b60e82b2f This commit was manufactured by cvs2svn to create tag
'Version_1_34_1'.

[SVN r38286]
2007-07-24 19:28:14 +00:00
7581949360 Patches from Trac #583.
[SVN r37846]
2007-06-01 16:12:08 +00:00
0b2aeda226 Merged copyright and license addition
[SVN r35907]
2006-11-07 19:27:00 +00:00
2ecd62c612 Remove obsolete Boost.Build v1 files.
[SVN r35880]
2006-11-06 17:10:46 +00:00
47033bd162 Fix inspection problems
[SVN r35827]
2006-11-03 19:41:10 +00:00
c7d5016022 Eliminate MSVC 8.0 warning
[SVN r35588]
2006-10-13 14:29:56 +00:00
d92355cca2 Suppress annoying MSVC warnings
[SVN r35424]
2006-09-29 17:23:28 +00:00
0123f84bff Suppress annoying MSVC warnings
[SVN r35423]
2006-09-29 17:23:17 +00:00
0207da8008 This commit was manufactured by cvs2svn to create branch 'RC_1_34_0'.
[SVN r33417]
2006-03-21 02:26:31 +00:00
6 changed files with 69 additions and 66 deletions

View File

@ -23,8 +23,8 @@
// in anything that may be included by function_template.hpp doesn't break
#include <boost/function/detail/prologue.hpp>
// Older Visual Age C++ version do not handle the file iteration well
#if BOOST_WORKAROUND(__IBMCPP__, >= 500) && BOOST_WORKAROUND(__IBMCPP__, < 800)
// Visual Age C++ doesn't handle the file iteration well
#if BOOST_WORKAROUND(__IBMCPP__, >= 500)
# if BOOST_FUNCTION_MAX_ARGS >= 0
# include <boost/function/function0.hpp>
# endif

View File

@ -203,11 +203,11 @@ namespace boost {
{
switch (op) {
case clone_functor_tag:
out_buffer.obj_ref = in_buffer.obj_ref;
out_buffer.obj_ref.obj_ptr = in_buffer.obj_ref.obj_ptr;
return;
case move_functor_tag:
out_buffer.obj_ref = in_buffer.obj_ref;
out_buffer.obj_ref.obj_ptr = in_buffer.obj_ref.obj_ptr;
in_buffer.obj_ref.obj_ptr = 0;
return;
@ -315,18 +315,14 @@ namespace boost {
if (op == clone_functor_tag || op == move_functor_tag) {
const functor_type* in_functor =
reinterpret_cast<const functor_type*>(&in_buffer.data);
new (reinterpret_cast<void*>(&out_buffer.data)) functor_type(*in_functor);
new ((void*)&out_buffer.data) functor_type(*in_functor);
if (op == move_functor_tag) {
functor_type* f = reinterpret_cast<functor_type*>(&in_buffer.data);
(void)f; // suppress warning about the value of f not being used (MSVC)
f->~Functor();
reinterpret_cast<functor_type*>(&in_buffer.data)->~Functor();
}
} else if (op == destroy_functor_tag) {
// Some compilers (Borland, vc6, ...) are unhappy with ~functor_type.
functor_type* f = reinterpret_cast<functor_type*>(&out_buffer.data);
(void)f; // suppress warning about the value of f not being used (MSVC)
f->~Functor();
reinterpret_cast<functor_type*>(&out_buffer.data)->~Functor();
} else if (op == check_functor_type_tag) {
const detail::sp_typeinfo& check_type
= *out_buffer.type.type;
@ -373,10 +369,8 @@ namespace boost {
// Clone the functor
// GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do.
// jewillco: Changing this to static_cast because GCC 2.95.3 is
// obsolete.
const functor_type* f =
static_cast<const functor_type*>(in_buffer.obj_ptr);
(const functor_type*)(in_buffer.obj_ptr);
functor_type* new_f = new functor_type(*f);
out_buffer.obj_ptr = new_f;
} else if (op == move_functor_tag) {
@ -480,7 +474,7 @@ namespace boost {
// GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do.
const functor_wrapper_type* f =
static_cast<const functor_wrapper_type*>(in_buffer.obj_ptr);
(const functor_wrapper_type*)(in_buffer.obj_ptr);
wrapper_allocator_type wrapper_allocator(static_cast<Allocator const &>(*f));
wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
wrapper_allocator.construct(copy, *f);
@ -677,7 +671,7 @@ public:
detail::function::check_functor_type_tag);
// GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do.
return static_cast<const Functor*>(type_result.obj_ptr);
return (const Functor*)(type_result.obj_ptr);
}
template<typename F>
@ -721,7 +715,7 @@ public:
public: // should be protected, but GCC 2.95.3 will fail to allow access
detail::function::vtable_base* get_vtable() const {
return reinterpret_cast<detail::function::vtable_base*>(
reinterpret_cast<std::size_t>(vtable) & ~static_cast<std::size_t>(0x01));
reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
}
bool has_trivial_copy_and_destroy() const {

View File

@ -486,19 +486,19 @@ namespace boost {
BOOST_FUNCTION_TEMPLATE_ARGS);
template<typename F>
bool assign_to(F f, function_buffer& functor) const
bool assign_to(F f, function_buffer& functor)
{
typedef typename get_function_tag<F>::type tag;
return assign_to(f, functor, tag());
}
template<typename F,typename Allocator>
bool assign_to_a(F f, function_buffer& functor, Allocator a) const
bool assign_to_a(F f, function_buffer& functor, Allocator a)
{
typedef typename get_function_tag<F>::type tag;
return assign_to_a(f, functor, a, tag());
}
void clear(function_buffer& functor) const
void clear(function_buffer& functor)
{
if (base.manager)
base.manager(functor, functor, destroy_functor_tag);
@ -508,13 +508,13 @@ namespace boost {
// Function pointers
template<typename FunctionPtr>
bool
assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag) const
assign_to(FunctionPtr f, function_buffer& functor, function_ptr_tag)
{
this->clear(functor);
if (f) {
// should be a reinterpret cast, but some compilers insist
// on giving cv-qualifiers to free functions
functor.func_ptr = reinterpret_cast<void (*)()>(f);
functor.func_ptr = (void (*)())(f);
return true;
} else {
return false;
@ -522,7 +522,7 @@ namespace boost {
}
template<typename FunctionPtr,typename Allocator>
bool
assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag) const
assign_to_a(FunctionPtr f, function_buffer& functor, Allocator, function_ptr_tag)
{
return assign_to(f,functor,function_ptr_tag());
}
@ -530,26 +530,26 @@ namespace boost {
// Member pointers
#if BOOST_FUNCTION_NUM_ARGS > 0
template<typename MemberPtr>
bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag) const
bool assign_to(MemberPtr f, function_buffer& functor, member_ptr_tag)
{
// DPG TBD: Add explicit support for member function
// objects, so we invoke through mem_fn() but we retain the
// right target_type() values.
if (f) {
this->assign_to(boost::mem_fn(f), functor);
this->assign_to(mem_fn(f), functor);
return true;
} else {
return false;
}
}
template<typename MemberPtr,typename Allocator>
bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag) const
bool assign_to_a(MemberPtr f, function_buffer& functor, Allocator a, member_ptr_tag)
{
// DPG TBD: Add explicit support for member function
// objects, so we invoke through mem_fn() but we retain the
// right target_type() values.
if (f) {
this->assign_to_a(boost::mem_fn(f), functor, a);
this->assign_to_a(mem_fn(f), functor, a);
return true;
} else {
return false;
@ -561,13 +561,13 @@ namespace boost {
// Assign to a function object using the small object optimization
template<typename FunctionObj>
void
assign_functor(FunctionObj f, function_buffer& functor, mpl::true_) const
assign_functor(FunctionObj f, function_buffer& functor, mpl::true_)
{
new (reinterpret_cast<void*>(&functor.data)) FunctionObj(f);
new ((void*)&functor.data) FunctionObj(f);
}
template<typename FunctionObj,typename Allocator>
void
assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_) const
assign_functor_a(FunctionObj f, function_buffer& functor, Allocator, mpl::true_)
{
assign_functor(f,functor,mpl::true_());
}
@ -575,13 +575,13 @@ namespace boost {
// Assign to a function object allocated on the heap.
template<typename FunctionObj>
void
assign_functor(FunctionObj f, function_buffer& functor, mpl::false_) const
assign_functor(FunctionObj f, function_buffer& functor, mpl::false_)
{
functor.obj_ptr = new FunctionObj(f);
}
template<typename FunctionObj,typename Allocator>
void
assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_) const
assign_functor_a(FunctionObj f, function_buffer& functor, Allocator a, mpl::false_)
{
typedef functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
typedef typename Allocator::template rebind<functor_wrapper_type>::other
@ -596,7 +596,7 @@ namespace boost {
template<typename FunctionObj>
bool
assign_to(FunctionObj f, function_buffer& functor, function_obj_tag) const
assign_to(FunctionObj f, function_buffer& functor, function_obj_tag)
{
if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
assign_functor(f, functor,
@ -608,7 +608,7 @@ namespace boost {
}
template<typename FunctionObj,typename Allocator>
bool
assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag) const
assign_to_a(FunctionObj f, function_buffer& functor, Allocator a, function_obj_tag)
{
if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
assign_functor_a(f, functor, a,
@ -623,9 +623,9 @@ namespace boost {
template<typename FunctionObj>
bool
assign_to(const reference_wrapper<FunctionObj>& f,
function_buffer& functor, function_obj_ref_tag) const
function_buffer& functor, function_obj_ref_tag)
{
functor.obj_ref.obj_ptr = (void *)(f.get_pointer());
functor.obj_ref.obj_ptr = (void *)f.get_pointer();
functor.obj_ref.is_const_qualified = is_const<FunctionObj>::value;
functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
return true;
@ -633,7 +633,7 @@ namespace boost {
template<typename FunctionObj,typename Allocator>
bool
assign_to_a(const reference_wrapper<FunctionObj>& f,
function_buffer& functor, Allocator, function_obj_ref_tag) const
function_buffer& functor, Allocator, function_obj_ref_tag)
{
return assign_to(f,functor,function_obj_ref_tag());
}
@ -677,7 +677,7 @@ namespace boost {
vtable_type* get_vtable() const {
return reinterpret_cast<vtable_type*>(
reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
reinterpret_cast<std::size_t>(vtable) & ~(std::size_t)0x01);
}
struct clear_type {};
@ -751,6 +751,9 @@ namespace boost {
~BOOST_FUNCTION_FUNCTION() { clear(); }
#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
// MSVC 6.0 and prior require all definitions to be inline, but
// these definitions can become very costly.
result_type operator()(BOOST_FUNCTION_PARMS) const
{
if (this->empty())
@ -759,6 +762,9 @@ namespace boost {
return get_vtable()->invoker
(this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
}
#else
result_type operator()(BOOST_FUNCTION_PARMS) const;
#endif
// The distinction between when to use BOOST_FUNCTION_FUNCTION and
// when to use self_type is obnoxious. MSVC cannot handle self_type as
@ -858,7 +864,7 @@ namespace boost {
#else
private:
struct dummy {
void nonnull() {}
void nonnull() {};
};
typedef void (dummy::*safe_bool)();
@ -903,7 +909,7 @@ namespace boost {
// static initialization. Otherwise, we will have a race
// condition here in multi-threaded code. See
// http://thread.gmane.org/gmane.comp.lib.boost.devel/164902/.
static const vtable_type stored_vtable =
static vtable_type stored_vtable =
{ { &manager_type::manage }, &invoker_type::invoke };
if (stored_vtable.assign_to(f, functor)) {
@ -911,7 +917,7 @@ namespace boost {
if (boost::has_trivial_copy_constructor<Functor>::value &&
boost::has_trivial_destructor<Functor>::value &&
detail::function::function_allows_small_object_optimization<Functor>::value)
value |= static_cast<size_t>(0x01);
value |= (std::size_t)0x01;
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
} else
vtable = 0;
@ -937,7 +943,7 @@ namespace boost {
// static initialization. Otherwise, we will have a race
// condition here in multi-threaded code. See
// http://thread.gmane.org/gmane.comp.lib.boost.devel/164902/.
static const vtable_type stored_vtable =
static vtable_type stored_vtable =
{ { &manager_type::manage }, &invoker_type::invoke };
if (stored_vtable.assign_to_a(f, functor, a)) {
@ -945,7 +951,7 @@ namespace boost {
if (boost::has_trivial_copy_constructor<Functor>::value &&
boost::has_trivial_destructor<Functor>::value &&
detail::function::function_allows_small_object_optimization<Functor>::value)
value |= static_cast<std::size_t>(0x01);
value |= (std::size_t)0x01;
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
} else
vtable = 0;
@ -992,6 +998,22 @@ namespace boost {
f1.swap(f2);
}
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
typename BOOST_FUNCTION_FUNCTION<
R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>::result_type
inline
BOOST_FUNCTION_FUNCTION<R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
::operator()(BOOST_FUNCTION_PARMS) const
{
if (this->empty())
boost::throw_exception(bad_function_call());
return get_vtable()->invoker
(this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
}
#endif
// Poison comparisons between boost::function objects of the same type.
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
void operator==(const BOOST_FUNCTION_FUNCTION<

View File

@ -8,7 +8,6 @@
# For more information, see http://www.boost.org/
project
: requirements <toolset>msvc:<asynch-exceptions>on
: source-location $(BOOST_ROOT)
;

View File

@ -10,28 +10,22 @@
#include <boost/function.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <iostream>
#include <functional>
struct X {
int foo(int);
std::ostream& foo2(std::ostream&) const;
};
int X::foo(int x) { return -x; }
std::ostream& X::foo2(std::ostream& x) const { return x; }
int main()
{
boost::function<int (X*, int)> f;
boost::function<std::ostream& (X*, std::ostream&)> f2;
f = &X::foo;
f2 = &X::foo2;
f = &X::foo;
X x;
f(&x, 5);
X x;
BOOST_TEST(f(&x, 5) == -5);
BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
return ::boost::report_errors();
return 0;
}

View File

@ -10,28 +10,22 @@
#include <boost/function.hpp>
#include <boost/detail/lightweight_test.hpp>
#include <iostream>
#include <functional>
struct X {
int foo(int);
std::ostream& foo2(std::ostream&) const;
};
int X::foo(int x) { return -x; }
std::ostream& X::foo2(std::ostream& x) const { return x; }
int main()
{
boost::function2<int, X*, int> f;
boost::function2<std::ostream&, X*, std::ostream&> f2;
f = &X::foo;
f2 = &X::foo2;
f = &X::foo;
X x;
f(&x, 5);
X x;
BOOST_TEST(f(&x, 5) == -5);
BOOST_TEST(f2(&x, boost::ref(std::cout)) == std::cout);
return ::boost::report_errors();
return 0;
}