Compare commits

..

8 Commits

Author SHA1 Message Date
03bef419ac merged from trunk
[SVN r49607]
2008-11-06 00:15:47 +00:00
20efadeb6f merged from trunk
[SVN r49439]
2008-10-22 20:32:22 +00:00
4f50451f4b merged from trunk
[SVN r49133]
2008-10-05 01:47:33 +00:00
313a188f4d merged from trunk
[SVN r48673]
2008-09-08 21:00:49 +00:00
50525d7fcc merged from trunk
[SVN r47983]
2008-08-05 05:39:57 +00:00
eda8bd6d1c Merged revisions 44724,44726-44730,44738,44741-44742,44744,44746-44750,44752-44753,44755-44756,44758,44764,44766-44768,44771-44775,44777,44781-44787,44789-44807,44812-44816,44818-44826,44831,44837-44840,44842-44853,44857,44862,44864,44873,44877,44881-44883,44886-44887,44889,44891,44893,44895,44897,44900-44902,44904-44907,44919,44934,44941-44942,44946,44949-44954,44957,44962,44968-44973,44975,44977,44979-44984,44991-44993,44995,44997-45002,45004-45006,45010-45011,45019,45023,45025-45027 via svnmerge from
https://svn.boost.org/svn/boost/trunk

................
  r44724 | daniel_frey | 2008-04-22 12:48:39 -0700 (Tue, 22 Apr 2008) | 1 line
  
  Reduce enable_shared_from_this overhead
................
  r44726 | emildotchevski | 2008-04-22 15:23:27 -0700 (Tue, 22 Apr 2008) | 1 line
  
  seems like <link>static causes errors
................
  r44727 | chris_kohlhoff | 2008-04-22 16:46:15 -0700 (Tue, 22 Apr 2008) | 2 lines
  
  Fix or suppress MSVC level 4 warnings. Fixes #1703.
................
  r44728 | pdimov | 2008-04-22 17:33:58 -0700 (Tue, 22 Apr 2008) | 1 line
  
  Silence an g++ -Wextra warning.
................
  r44729 | noel_belcourt | 2008-04-22 18:35:01 -0700 (Tue, 22 Apr 2008) | 11 lines
  
  Fixed intel-darwin unresolved symbols by changing the 
  wide integer type from unsigned int (which managles as
  a 'j') to an int (which mangles as an 'i').  This
  change makes intel-darwin generated code match the 
  darwin toolset generated code.
  
  Intel reports this won't be fixed in 10.1 because it's
  an ABI breanking chanage so we won't see this patched 
  until the 10.2 compilers.
................
  r44730 | daniel_frey | 2008-04-22 23:12:39 -0700 (Tue, 22 Apr 2008) | 1 line
  
  Reduce enable_shared_from_this overhead (replace _internal_shared_ptr by _internal_shared_count)
................
  r44738 | danieljames | 2008-04-23 00:09:58 -0700 (Wed, 23 Apr 2008) | 85 lines
  
  Merge support for emplace for compilers with rvalue references and variadic templates arguments, and better use of C++0x allocators.
  Merged revisions 44058-44075,44078-44084,44086-44108,44110-44365,44367,44369-44414,44416-44419,44421-44457,44467-44469,44471-44511,44513-44535,44537-44737 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ................
    r44467 | danieljames | 2008-04-16 18:35:56 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Add C++-0x support to the test allocators.
  ................
    r44468 | danieljames | 2008-04-16 18:36:06 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Add a C++-0x node_constructor.
  ................
    r44469 | danieljames | 2008-04-16 18:36:16 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    C++-0x constructor for node.
  ................
    r44516 | danieljames | 2008-04-17 21:41:48 +0100 (Thu, 17 Apr 2008) | 16 lines
    
    Merge in my work so far on implementing emplace for compilers with variadic
    template & rvalue references.
    
    Merged revisions 44059-44062 via svnmerge from 
    https://svn.boost.org/svn/boost/branches/unordered/dev
    
    ........
      r44059 | danieljames | 2008-04-05 17:41:25 +0100 (Sat, 05 Apr 2008) | 1 line
      
      First stab at implementing emplace - only for compilers with variadic template & rvalue references.
    ........
      r44062 | danieljames | 2008-04-05 19:12:09 +0100 (Sat, 05 Apr 2008) | 1 line
      
      Better variable template arguments, need to add proper support to BoostBook.
    ........
  ................
    r44616 | danieljames | 2008-04-20 13:30:19 +0100 (Sun, 20 Apr 2008) | 1 line
    
    Merge with trunk, fixes tabs.
  ................
    r44618 | danieljames | 2008-04-20 13:42:38 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Some extra compile tests.
  ................
    r44619 | danieljames | 2008-04-20 13:42:50 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Fix an error message.
  ................
    r44703 | danieljames | 2008-04-21 20:19:50 +0100 (Mon, 21 Apr 2008) | 15 lines
    
    Merge latest changes from trunk.
    
    Merged revisions 44616-44702 via svnmerge from 
    https://svn.boost.org/svn/boost/trunk
    
    ........
      r44650 | danieljames | 2008-04-20 22:08:57 +0100 (Sun, 20 Apr 2008) | 1 line
      
      Update an include.
    ........
      r44697 | danieljames | 2008-04-21 16:55:40 +0100 (Mon, 21 Apr 2008) | 1 line
      
      Factor out the code for choosing the bucket count, and which bucket that hash values map to make it easier to experiment with alternative policies.
    ........
  ................
    r44733 | danieljames | 2008-04-23 07:55:43 +0100 (Wed, 23 Apr 2008) | 2 lines
    
    Remove 'reserve_extra'.
  ................
    r44734 | danieljames | 2008-04-23 07:55:55 +0100 (Wed, 23 Apr 2008) | 2 lines
    
    More unnecessary copy tests - showing some weakness in the emplace implementation.
  ................
    r44735 | danieljames | 2008-04-23 07:56:06 +0100 (Wed, 23 Apr 2008) | 2 lines
    
    More tests.
  ................
    r44736 | danieljames | 2008-04-23 07:56:19 +0100 (Wed, 23 Apr 2008) | 2 lines
    
    Comment out a test which requires a C++0x std::pair.
  ................
    r44737 | danieljames | 2008-04-23 07:56:35 +0100 (Wed, 23 Apr 2008) | 2 lines
    
    Avoid creating unnecessary copies in unordered_set::emplace and unordered_map::emplace.
  ................
................
  r44741 | noel_belcourt | 2008-04-23 09:16:38 -0700 (Wed, 23 Apr 2008) | 4 lines
  
  Patch PGI to fix config problem (clock_gettime is unresolved
  external) and add required macro define for IOV_MAX support.
................
  r44742 | emildotchevski | 2008-04-23 10:31:56 -0700 (Wed, 23 Apr 2008) | 1 line
  
  Fix for http://tinyurl.com/6owy6b.
................
  r44744 | daniel_frey | 2008-04-23 12:32:44 -0700 (Wed, 23 Apr 2008) | 1 line
  
  Remove dynamic_cast in init_internal_shared_once()
................
  r44746 | noel_belcourt | 2008-04-23 18:40:31 -0700 (Wed, 23 Apr 2008) | 4 lines
  
  Fixup patch to intel-darwin.jam so it looks and
  reads a bit better.
................
  r44747 | noel_belcourt | 2008-04-23 21:58:27 -0700 (Wed, 23 Apr 2008) | 3 lines
  
  Force pgi to always link rt lib, ugh.
................
  r44748 | johnmaddock | 2008-04-24 02:40:31 -0700 (Thu, 24 Apr 2008) | 3 lines
  
  Apply VC-7.1 fixes: sometimes ADL fails, and we need a using declaration in order for the correct overload to be found.
  Add missing #include. to t_distribution_inv.hpp.
  Suppress unnecessary instantiations in instantiate_all.cpp.
................
  r44749 | hkaiser | 2008-04-24 06:52:22 -0700 (Thu, 24 Apr 2008) | 1 line
  
  Phoenix: disambiguated ref() (gcc 4.3 complained...)
................
  r44750 | hkaiser | 2008-04-24 06:54:05 -0700 (Thu, 24 Apr 2008) | 1 line
  
  Spirit.Qi: helping gcc 4.3 to understand what's going on.
................
  r44752 | bemandawes | 2008-04-24 13:29:08 -0700 (Thu, 24 Apr 2008) | 1 line
  
  Fix #1858, typo in non-member operators table
................
  r44753 | grafik | 2008-04-24 13:30:03 -0700 (Thu, 24 Apr 2008) | 1 line
  
  Make it possible to filter which libraries are tested from the CLI with "--filter-tests=" options.
................
  r44755 | djowel | 2008-04-24 15:13:32 -0700 (Thu, 24 Apr 2008) | 1 line
  
  added nullary function support
................
  r44756 | djowel | 2008-04-24 15:13:58 -0700 (Thu, 24 Apr 2008) | 1 line
  
  use plain functions instead of bind
................
  r44758 | noel_belcourt | 2008-04-24 16:05:16 -0700 (Thu, 24 Apr 2008) | 4 lines
  
  Added no two phase name lookup for intel-darwin
  compilers.
................
  r44764 | noel_belcourt | 2008-04-25 08:38:26 -0700 (Fri, 25 Apr 2008) | 4 lines
  
  Enable macros BOOST_HAS_PTHREAD_MUTEXATTR_SETTYPE and
  BOOST_HAS_NANOSLEEP.
................
  r44766 | niels_dekker | 2008-04-25 09:50:32 -0700 (Fri, 25 Apr 2008) | 1 line
  
  Improved swap for optional<T>, co-written by Thorsten and Fernando: added support for tweaking whether swap should use T's default constructor. Added swap member function. Discussed at Boost developers' mailing list, "[optional] problems with swap()", http://lists.boost.org/Archives/boost/2008/04/135882.php
................
  r44767 | niels_dekker | 2008-04-25 09:52:34 -0700 (Fri, 25 Apr 2008) | 1 line
  
  Added unit tests, testing optional<T> swap improvements of revision [44766] 
................
  r44768 | noel_belcourt | 2008-04-25 10:37:47 -0700 (Fri, 25 Apr 2008) | 3 lines
  
  Get config tests working (missing -lrt).
................
  r44771 | hkaiser | 2008-04-25 19:02:44 -0700 (Fri, 25 Apr 2008) | 1 line
  
  Applied patch provided by Felipe Magno de Almeida [felipe.m.almeida@gmail.com].
................
  r44772 | daniel_frey | 2008-04-25 23:36:59 -0700 (Fri, 25 Apr 2008) | 1 line
  
  No need for the new ctors to be templates
................
  r44773 | anthonyw | 2008-04-26 00:34:46 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Fixed g++ compile error
................
  r44774 | speedsnail | 2008-04-26 02:54:07 -0700 (Sat, 26 Apr 2008) | 3 lines
  
  use-project didn't actually do what the comment promised.
  This triggered an error with thread Jamfile that could be seen when bjam was invoked in rootdir with
  bjam --with-wave.
................
  r44775 | pdimov | 2008-04-26 06:39:52 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Added a few more tests.
................
  r44777 | daniel_frey | 2008-04-26 08:42:13 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Added new reset()-counterparts for the new ctors
................
  r44781 | emildotchevski | 2008-04-26 10:43:58 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Added protected destructor to the base type error_info_base
................
  r44782 | daniel_frey | 2008-04-26 12:59:11 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Refactored and optimized enable_shared_from_this
................
  r44783 | hkaiser | 2008-04-26 13:09:56 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Added wrap_action for zero parameter semantic actions
................
  r44784 | hkaiser | 2008-04-26 13:10:36 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: fixed typos in comments
................
  r44785 | hkaiser | 2008-04-26 13:11:25 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Classic: Added some explaining comments to the namespace handling.
................
  r44786 | hkaiser | 2008-04-26 13:12:12 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: applied patch from #1886, closed now.
................
  r44787 | hkaiser | 2008-04-26 13:24:00 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: Switched to use unordered from main Boost distribution, removed local copy of unordered.
................
  r44789 | hkaiser | 2008-04-26 14:51:59 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Phoenix: Fixed gcc 4.3.0 compilation issue.
................
  r44790 | grafik | 2008-04-26 15:21:50 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Add the test target name to the bjam XML log output to make it easier to match tests to jam targets.
................
  r44791 | grafik | 2008-04-26 16:15:40 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Re-implement PJL in Python to fix various problems with the C++ version. In brief to remove the need of a good C++ compiler to submit results, remove the post-processing of the raw bjam output, and to fix missing results (for example Spirit classic results).
................
  r44792 | hkaiser | 2008-04-26 17:49:41 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: disabled some warnings for VC /W4
................
  r44793 | hkaiser | 2008-04-26 18:00:34 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: suppressed more VC level 4 warnings
................
  r44794 | hkaiser | 2008-04-26 18:04:25 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Fusion: Fixed a VC level 4 warning
................
  r44795 | hkaiser | 2008-04-26 18:08:04 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: suppressed more VC level 4 warnings.
................
  r44796 | hkaiser | 2008-04-26 18:08:43 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: suppressed more VC level 4 warnings.
................
  r44797 | hkaiser | 2008-04-26 18:38:42 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: Attempt to fix Intel V9.1 issue.
................
  r44798 | hkaiser | 2008-04-26 18:44:31 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: fixed some gcc 4.3 warnings.
................
  r44799 | hkaiser | 2008-04-26 18:45:05 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: Fixed gcc 4.3 compilation erros.
................
  r44800 | hkaiser | 2008-04-26 18:46:24 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: fixed some gcc 4.3 warnings.
................
  r44801 | hkaiser | 2008-04-26 18:47:35 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Lex: fixed some gcc 4.3 warnings.
................
  r44802 | hkaiser | 2008-04-26 18:50:50 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Karma: Fixed Jamfile
................
  r44803 | hkaiser | 2008-04-26 18:59:44 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Qi: Fixed a ambiguity reported by gcc 4.3
................
  r44804 | hkaiser | 2008-04-26 19:01:22 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit.Karma: Fixed gcc 4.3 compilation issue.
................
  r44805 | hkaiser | 2008-04-26 19:04:07 -0700 (Sat, 26 Apr 2008) | 1 line
  
  Spirit: Fixed a ambiguity reported by VC8 for embedded systems
................
  r44806 | djowel | 2008-04-26 20:21:12 -0700 (Sat, 26 Apr 2008) | 1 line
  
  tweak: const correctness
................
  r44807 | danieljames | 2008-04-27 00:39:49 -0700 (Sun, 27 Apr 2008) | 78 lines
  
  Merge in documentation fixes.  Apart from the change to optional's documenation
  Jamfile, which I included by mistake.
  
  Fixes #1659, #1661, #1684, #1685, 1687, #1690, #1801
  
  I wrote about this at:
  
  http://lists.boost.org/Archives/boost/2008/04/136405.php
  
  Merged revisions 44585-44806 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/doc
  
  ........
    r44585 | danieljames | 2008-04-19 16:25:27 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix broken link to vacpp in bjam docs. Refs #1512
  ........
    r44586 | danieljames | 2008-04-19 16:27:36 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix broken link to bcpp in bjam docs. Refs #1513
  ........
    r44587 | danieljames | 2008-04-19 16:33:58 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    DateTime documentation - Fix a link to the serialization library. Refs #1659
  ........
    r44588 | danieljames | 2008-04-19 16:35:36 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix some links in interprocess & intrusive. Refs #1661
  ........
    r44589 | danieljames | 2008-04-19 16:37:39 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix some links in the python docs. Refs #1684.
  ........
    r44590 | danieljames | 2008-04-19 16:38:29 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Work around a quickbook bug which is affecting the python docs. Refs #1684.
  ........
    r44591 | danieljames | 2008-04-19 16:39:34 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix a broken link in the numeric conversion docs. Refs #1685
  ........
    r44592 | danieljames | 2008-04-19 16:40:45 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix some links in the optional docs. Refs #1687
  ........
    r44593 | danieljames | 2008-04-19 16:42:09 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix link to the hash documentation from bimap. Refs #1690
  ........
    r44599 | danieljames | 2008-04-19 18:07:33 +0100 (Sat, 19 Apr 2008) | 2 lines
    
    Fix a typo in the format library. Refs #1801
  ........
    r44600 | danieljames | 2008-04-19 19:20:59 +0100 (Sat, 19 Apr 2008) | 1 line
    
    Initialise svnmerge.
  ........
    r44641 | danieljames | 2008-04-20 18:59:47 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Fix the lincense url in shared container iterator documentation.
  ........
    r44642 | danieljames | 2008-04-20 19:00:00 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Fix image link in the mpi documentation.
  ........
    r44643 | danieljames | 2008-04-20 19:00:11 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Fix a typo in the spirit docs.
  ........
    r44644 | danieljames | 2008-04-20 19:00:23 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Escape the slash so that quickbook doesn't think it the start of an italic section, and mess up the link. Refs #1844
  ........
    r44647 | danieljames | 2008-04-20 19:39:47 +0100 (Sun, 20 Apr 2008) | 2 lines
    
    Fix another typo in spirit docs.
  ........
................
  r44812 | djowel | 2008-04-27 01:41:13 -0700 (Sun, 27 Apr 2008) | 1 line
  
  added grammar_class
................
  r44813 | djowel | 2008-04-27 01:41:47 -0700 (Sun, 27 Apr 2008) | 1 line
  
  added grammar_class test
................
  r44814 | djowel | 2008-04-27 01:44:38 -0700 (Sun, 27 Apr 2008) | 1 line
  
  tweak grammar_class test
................
  r44815 | djowel | 2008-04-27 02:11:33 -0700 (Sun, 27 Apr 2008) | 1 line
  
  tweak grammar_class test
................
  r44816 | djowel | 2008-04-27 02:11:49 -0700 (Sun, 27 Apr 2008) | 1 line
  
  tweak grammar_class
................
  r44818 | igaztanaga | 2008-04-27 07:57:11 -0700 (Sun, 27 Apr 2008) | 13 lines
  
  Intrusive:
  
  *  Added `linear<>` and `cache_last<>` options to singly linked lists.
  *  Added `optimize_multikey<>` option to unordered container hooks.
  *  Optimized unordered containers when `store_hash` option is used in the hook.
  *  Implementation changed to be exception agnostic so that it can be used
     in environments without exceptions.
  *  Added `container_from_iterator` function to tree-based containers.
  
  Interprocess:
  
  *  Added anonymous shared memory for UNIX systems.
  *  Fixed file lock compilation errors
................
  r44819 | igaztanaga | 2008-04-27 08:03:06 -0700 (Sun, 27 Apr 2008) | 13 lines
  
  Intrusive:
  
  *  Added `linear<>` and `cache_last<>` options to singly linked lists.
  *  Added `optimize_multikey<>` option to unordered container hooks.
  *  Optimized unordered containers when `store_hash` option is used in the hook.
  *  Implementation changed to be exception agnostic so that it can be used
     in environments without exceptions.
  *  Added `container_from_iterator` function to tree-based containers.
  
  Interprocess:
  
  *  Added anonymous shared memory for UNIX systems.
  *  Fixed file lock compilation errors
................
  r44820 | hkaiser | 2008-04-27 11:09:29 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Spirit.Lex: introduced workaround for Intel compilers <= V9.1
................
  r44821 | hkaiser | 2008-04-27 11:11:17 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Spirit.Qi: Made it clear for gcc 4.3 which ref() to use.
................
  r44822 | hkaiser | 2008-04-27 11:14:49 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Spirit.Lex: Fixed a gcc 4.3 warning 
................
  r44823 | hkaiser | 2008-04-27 11:28:04 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Spirit.Lex: Fixed a gcc 4.3 warning 
................
  r44824 | hkaiser | 2008-04-27 11:37:41 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Spirit.Lex: Fixed a gcc 4.3 warning (again, sigh)
................
  r44825 | niels_dekker | 2008-04-27 14:07:10 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Added forward declaration of optional<T>'s boost::swap overload, as mentioned at http://article.gmane.org/gmane.comp.lib.boost.devel/174350 "Re: [optional] problems with swap()"
................
  r44826 | niels_dekker | 2008-04-27 14:09:50 -0700 (Sun, 27 Apr 2008) | 1 line
  
  Replaced "using std::swap" by "using boost::swap" within optional::swap member function, hoping to fix GCC test failures, as mentioned at http://article.gmane.org/gmane.comp.lib.boost.devel/174350 "Re: [optional] problems with swap()"
................
  r44831 | djowel | 2008-04-27 18:07:52 -0700 (Sun, 27 Apr 2008) | 1 line
  
  tweaks
................
  r44837 | daniel_frey | 2008-04-28 00:17:11 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Improved sp_deleter_wrapper implementation
................
  r44838 | anthonyw | 2008-04-28 02:00:58 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Added detail::try_lock_wrapper for use as scoped_try_lock typedefs, to fix issue #1873
................
  r44839 | anthonyw | 2008-04-28 02:04:40 -0700 (Mon, 28 Apr 2008) | 1 line
  
  reverted accidental change
................
  r44840 | anthonyw | 2008-04-28 02:10:38 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Added entry to breaking changes about default-constructed threads and the current thread: issue #1835
................
  r44842 | johnmaddock | 2008-04-28 04:07:14 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Fixes for issue #1871 that prevents duplicate symbol errors with VC++ compilers, when building with /Zc:wchar_t-.
................
  r44843 | djowel | 2008-04-28 04:15:13 -0700 (Mon, 28 Apr 2008) | 1 line
  
  experimental grammar/grammar_def unification
................
  r44844 | djowel | 2008-04-28 04:16:29 -0700 (Mon, 28 Apr 2008) | 1 line
  
  experimental grammar/grammar_def unification
................
  r44845 | djowel | 2008-04-28 04:17:09 -0700 (Mon, 28 Apr 2008) | 1 line
  
  calc2 generating an AST
................
  r44846 | anthonyw | 2008-04-28 05:26:27 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Updated locks.hpp to work with gcc as well as msvc
................
  r44847 | hkaiser | 2008-04-28 06:33:15 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Spirit.Lex: fixed workaround for Intel compilers <= V9.1
................
  r44848 | chris_kohlhoff | 2008-04-28 06:35:27 -0700 (Mon, 28 Apr 2008) | 2 lines
  
  Update asio version number.
................
  r44849 | chris_kohlhoff | 2008-04-28 06:36:18 -0700 (Mon, 28 Apr 2008) | 2 lines
  
  Add raw socket support.
................
  r44850 | hkaiser | 2008-04-28 06:44:40 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Spirit.Qi: Added a missing 'using namespace'.
................
  r44851 | chris_kohlhoff | 2008-04-28 06:56:07 -0700 (Mon, 28 Apr 2008) | 2 lines
  
  Add an experimental two-lock queue implementation for task_io_service.
................
  r44852 | dgregor | 2008-04-28 07:11:46 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Improve documentation on the size/efficiency of boost::function objects
................
  r44853 | hkaiser | 2008-04-28 07:34:02 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Spirit.Qi: calc2_ast: fixed a wrong include statement
................
  r44857 | eric_niebler | 2008-04-28 09:46:33 -0700 (Mon, 28 Apr 2008) | 1 line
  
  add missing #include
................
  r44862 | niels_dekker | 2008-04-28 14:14:15 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Marked MSVC 7.1 optional_test failure as "expected", because of an ADL-related compiler issue.
................
  r44864 | guwi17 | 2008-04-28 14:50:19 -0700 (Mon, 28 Apr 2008) | 4 lines
  
  - fix and close #1829
  - You are right. The scaled norm wrongly assumed that the first element is not zero.
................
  r44873 | daniel_frey | 2008-04-28 22:32:13 -0700 (Mon, 28 Apr 2008) | 1 line
  
  Fixed comment to reflect the intention and the current code
................
  r44877 | johnmaddock | 2008-04-29 03:05:11 -0700 (Tue, 29 Apr 2008) | 2 lines
  
  Changed long long to boost::long_long_type and unsigned long long to boost::ulong_long_type.
  A couple of other typo corrections, to get the code compiling with g++ -pedantic.
................
  r44881 | hkaiser | 2008-04-29 06:53:21 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Qi: Fixed grammar_test
................
  r44882 | hkaiser | 2008-04-29 07:09:40 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Qi: Fixed grammar_test
................
  r44883 | hkaiser | 2008-04-29 07:47:29 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Qi: Minor edits mainly in comments
................
  r44886 | emildotchevski | 2008-04-29 10:17:45 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Added required header #include <new>
................
  r44887 | dgregor | 2008-04-29 10:57:54 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Add support for MPI_SIGNED_CHAR to Boost.MPI
................
  r44889 | dgregor | 2008-04-29 11:18:01 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Remove names of unused variables. Fixes #1832 and fixes #1865
................
  r44891 | dgregor | 2008-04-29 11:34:28 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Correct erroneous call to is_reachable from is_connected. Fixes #870
................
  r44893 | dgregor | 2008-04-29 11:37:26 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Improve logic to guess the toolset name in top-level configure script. Fixes #1087
................
  r44895 | dgregor | 2008-04-29 11:46:17 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Make configure more closely follow autotools conventions. Fixes #1664
................
  r44897 | marshall | 2008-04-29 13:16:19 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Updated bounds on uniform_real and uniform_smallint to allow min == max
................
  r44900 | jurko | 2008-04-29 15:49:36 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Typo corrections & minor stylistic comment changes.
................
  r44901 | hkaiser | 2008-04-29 17:59:08 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Karma: Fixed rule, added calc2_ast_dump example
................
  r44902 | hkaiser | 2008-04-29 18:33:53 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit: Fixed main classic header
................
  r44904 | hkaiser | 2008-04-29 18:57:39 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Karma: Fixing ref() ambiguity
................
  r44905 | hkaiser | 2008-04-29 18:59:05 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Karma: Fixing ref() ambiguity
................
  r44906 | hkaiser | 2008-04-29 19:00:28 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Qi: Fixing ref() ambiguity
................
  r44907 | hkaiser | 2008-04-29 19:02:27 -0700 (Tue, 29 Apr 2008) | 1 line
  
  Spirit.Qi: Fixing ref() ambiguity
................
  r44919 | danieljames | 2008-04-30 00:57:04 -0700 (Wed, 30 Apr 2008) | 49 lines
  
  Merge in support for equality operators for the unordered containers and
  hopefully better cross-platform support.
  
  Merged revisions 44778-44835,44837-44918 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44778 | danieljames | 2008-04-26 17:15:44 +0100 (Sat, 26 Apr 2008) | 2 lines
    
    Remove a trailing comma.
  ........
    r44779 | danieljames | 2008-04-26 17:23:51 +0100 (Sat, 26 Apr 2008) | 1 line
    
    Merge in support for equality operators.
  ........
    r44780 | danieljames | 2008-04-26 17:28:44 +0100 (Sat, 26 Apr 2008) | 1 line
    
    Use my own list container to avoid working around STL container bugs.
  ........
    r44833 | danieljames | 2008-04-28 08:03:43 +0100 (Mon, 28 Apr 2008) | 1 line
    
    Better equality tests.
  ........
    r44834 | danieljames | 2008-04-28 08:04:03 +0100 (Mon, 28 Apr 2008) | 1 line
    
    Remove a superfluous check.
  ........
    r44835 | danieljames | 2008-04-28 08:04:21 +0100 (Mon, 28 Apr 2008) | 1 line
    
    Add equality reference documentation.
  ........
    r44916 | danieljames | 2008-04-30 08:16:52 +0100 (Wed, 30 Apr 2008) | 1 line
    
    New version of list.hpp
  ........
    r44917 | danieljames | 2008-04-30 08:18:31 +0100 (Wed, 30 Apr 2008) | 1 line
    
    Support compilers without ADL in the compile tests.
  ........
    r44918 | danieljames | 2008-04-30 08:25:20 +0100 (Wed, 30 Apr 2008) | 7 lines
    
    Change the typedef of buffered functions as it was confusing MSVC 6.5
    
    get_allocator wasn't compiling when the allocator workaround is used because it
    couldn't cast from the wrapped allocator to an allocator of another type. So
    use value_alloc_ when it's available (it's only unavailable on compilers with
    C++0x support, which don't require the workaround).
  ........
................
  r44934 | hkaiser | 2008-04-30 08:47:07 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Spirit.Karma: Added example calc2_ast_rpn
................
  r44941 | jurko | 2008-04-30 12:24:04 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Comment cleanup - both stylistic & typo corrections.
................
  r44942 | jurko | 2008-04-30 12:26:55 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Comment typo correction.
................
  r44946 | jurko | 2008-04-30 12:45:29 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Added several svn:ignore Subversion properties to make Subversion ignore folders creating during default Boost & Boost Jam builds on Windows.
................
  r44949 | jurko | 2008-04-30 13:00:24 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Removed trailing spaces from tools/build/v2/build/modifiers.jam.
................
  r44950 | hkaiser | 2008-04-30 13:33:23 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Spirit.Karma: Fixed rule tests (pattern.cpp)
................
  r44951 | hkaiser | 2008-04-30 13:41:37 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Spirit.Karma: added #include <boost/config/warning_disable.hpp> to Karma examples
................
  r44952 | hkaiser | 2008-04-30 13:42:11 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Spirit.Lex: added #include <boost/config/warning_disable.hpp> to Lex examples
................
  r44953 | jurko | 2008-04-30 13:58:05 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Corrected a typo in the Boost Build documentation.
................
  r44954 | emildotchevski | 2008-04-30 14:45:00 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Integration of Boost Exception in boost::throw_exception().
................
  r44957 | hkaiser | 2008-04-30 15:54:09 -0700 (Wed, 30 Apr 2008) | 1 line
  
  Spirit.Qi: added #include <boost/config/warning_disable.hpp> to Qi examples
................
  r44962 | djowel | 2008-04-30 19:10:56 -0700 (Wed, 30 Apr 2008) | 1 line
  
  integer overflow fix
................
  r44968 | danieljames | 2008-05-01 02:23:22 -0700 (Thu, 01 May 2008) | 2 lines
  
  Add list.hpp which was missed from the merge.
................
  r44969 | jurko | 2008-05-01 02:39:45 -0700 (Thu, 01 May 2008) | 1 line
  
  Consistently converted tabs to spaces in tools/build/v2/test/BoostBuild.py to avoid confusion reading the Python source.
................
  r44970 | jurko | 2008-05-01 02:55:47 -0700 (Thu, 01 May 2008) | 1 line
  
  Renamed the Tester.wait_for_time_change() function to Tester.wait_for_time_change_since_last_build() to avoid confusion.
................
  r44971 | jurko | 2008-05-01 03:03:15 -0700 (Thu, 01 May 2008) | 1 line
  
  Boost Build documentation typo correction. Removed trailing spaces. Minor stylistic changes.
................
  r44972 | johnmaddock | 2008-05-01 04:51:39 -0700 (Thu, 01 May 2008) | 1 line
  
  Fix broken URL.
................
  r44973 | hkaiser | 2008-05-01 07:17:52 -0700 (Thu, 01 May 2008) | 1 line
  
  Spirit.Karma: Trying to workaround a gcc 4.2.1 bug.
................
  r44975 | jurko | 2008-05-01 08:09:58 -0700 (Thu, 01 May 2008) | 1 line
  
  Boost Build comment typo corrections and minor stylistic changes.
................
  r44977 | hkaiser | 2008-05-01 09:20:38 -0700 (Thu, 01 May 2008) | 1 line
  
  Wave: Changing properties for test.cfg to fix test failures non Windows systems
................
  r44979 | pdimov | 2008-05-01 09:50:39 -0700 (Thu, 01 May 2008) | 1 line
  
  make_shared added; tweaks for old compilers; fixes #1884.
................
  r44980 | jurko | 2008-05-01 10:01:03 -0700 (Thu, 01 May 2008) | 1 line
  
  Minor stylistic comment changes.
................
  r44981 | jurko | 2008-05-01 10:04:22 -0700 (Thu, 01 May 2008) | 1 line
  
  Added explanation comments for match_exact() and match_re() functions in tools/build/v2/test/TestCmd.py. Removed corpse interpreted member from the TescCmd class and the related setter function in tools/build/v2/test/TestCmd.py. Minor stylistic comment changes.
................
  r44982 | jurko | 2008-05-01 10:06:02 -0700 (Thu, 01 May 2008) | 1 line
  
  Updated the main Tester class comment in tools/build/v2/build/v2/test/BoostBuild.py describing all of its available constructor parameters. Minor stylistic changes.
................
  r44983 | jurko | 2008-05-01 10:08:04 -0700 (Thu, 01 May 2008) | 1 line
  
  Updated the Boost Build test system documentation. Now all the command line options are described. Several function descriptions updated.
................
  r44984 | hkaiser | 2008-05-01 10:31:42 -0700 (Thu, 01 May 2008) | 1 line
  
  Spirit.Lex: Removed unused variables
................
  r44991 | jurko | 2008-05-01 12:47:37 -0700 (Thu, 01 May 2008) | 1 line
  
  Fixed a bug with BOOST_BUILD_PATH not getting set correctly in Boost Build unit tests in case it contained spaces.
................
  r44992 | jurko | 2008-05-01 12:55:50 -0700 (Thu, 01 May 2008) | 1 line
  
  Added the default Boost Jam build target folders on cygwin - bin.cygwinx86 & bin.cygwinc86.debug to the svn:ignore list.
................
  r44993 | jurko | 2008-05-01 13:22:12 -0700 (Thu, 01 May 2008) | 1 line
  
  Upgraded the internal Boost Build test system so it can be run from folders whose names contain spaces on Windows. Also added a workaround for a Python bug on Windows where it has some undocumented behavior when starting processes using commands containing quotes.
................
  r44995 | jurko | 2008-05-01 14:19:11 -0700 (Thu, 01 May 2008) | 1 line
  
  Minor stylistic changes.
................
  r44997 | chris_kohlhoff | 2008-05-01 15:00:26 -0700 (Thu, 01 May 2008) | 3 lines
  
  Add a fast path for some speculative read and write operations in the
  epoll_reactor.
................
  r44998 | chris_kohlhoff | 2008-05-01 15:27:21 -0700 (Thu, 01 May 2008) | 3 lines
  
  A memory barrier is needed on some platforms to ensure that all updates
  to the node occur before the tail pointer is updated.
................
  r44999 | jurko | 2008-05-01 17:10:09 -0700 (Thu, 01 May 2008) | 1 line
  
  Minor stylistic changes.
................
  r45000 | jurko | 2008-05-01 17:12:29 -0700 (Thu, 01 May 2008) | 1 line
  
  Added support for tests checking that a build run did not take longer than expected to finish. Minor stylistic changes.
................
  r45001 | jurko | 2008-05-01 17:36:23 -0700 (Thu, 01 May 2008) | 1 line
  
  Added a new regression test making sure that the Boost Jam SORT builtin rule does not start getting quadratic behavior in some special cases as well as testing that the sorting algorithm works correctly. Related to the patch committed in revision 44195. Trimmed trailing spaces in tools/build/v2/test/test_all.py.
................
  r45002 | jurko | 2008-05-01 17:51:05 -0700 (Thu, 01 May 2008) | 1 line
  
  Documentation typo corrected.
................
  r45004 | jurko | 2008-05-01 17:57:29 -0700 (Thu, 01 May 2008) | 1 line
  
  Minor stylistic changes.
................
  r45005 | jurko | 2008-05-01 18:02:01 -0700 (Thu, 01 May 2008) | 1 line
  
  Updated the Boost Build test system's documentation about Tester.run_build_system() parameters. Minor stylistic changes.
................
  r45006 | chris_kohlhoff | 2008-05-02 00:59:01 -0700 (Fri, 02 May 2008) | 3 lines
  
  Fully qualify uses of asio's placeholders to resolve ambiguity with C++0x's
  placeholders namespace.
................
  r45010 | chris_kohlhoff | 2008-05-02 01:38:15 -0700 (Fri, 02 May 2008) | 3 lines
  
  Don't use the names readv and writev for functions defined inside asio as
  these names seem to be macros on Tru64.
................
  r45011 | nesotto | 2008-05-02 01:38:15 -0700 (Fri, 02 May 2008) | 1 line
  
  added missing const in insert()
................
  r45019 | igaztanaga | 2008-05-02 04:07:08 -0700 (Fri, 02 May 2008) | 1 line
  
  Tickets #1883, #1862, #1709
................
  r45023 | jurko | 2008-05-02 08:26:44 -0700 (Fri, 02 May 2008) | 1 line
  
  Minor stylistic Boost Build code changes.
................
  r45025 | grafik | 2008-05-02 08:44:25 -0700 (Fri, 02 May 2008) | 1 line
  
  Use all test sub-projects regardless of filtering so that the tests show up in the bjam XML log.
................
  r45026 | grafik | 2008-05-02 08:52:42 -0700 (Fri, 02 May 2008) | 1 line
  
  Add support for test log processing with process_jam_log.py instead of C++ PJL. (also fixes #1889)
................
  r45027 | pdimov | 2008-05-02 09:49:34 -0700 (Fri, 02 May 2008) | 1 line
  
  Fix throwing enums instead of archive_exceptions.
................


[SVN r45029]
2008-05-02 17:44:19 +00:00
c07234dd7c Merged revisions 44452,44472-44484,44486-44493,44495-44497,44499,44506-44507 via svnmerge from
https://svn.boost.org/svn/boost/trunk

................
  r44452 | johnmaddock | 2008-04-16 04:57:29 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Reinstated real_cast to that STLPort tests can pass.
................
  r44472 | emildotchevski | 2008-04-16 11:24:17 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Added #define NOMINMAX to preserve standard behavior of std::min and std::max. Is including <windows.h> here necessary?
................
  r44473 | emildotchevski | 2008-04-16 11:36:30 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Reverting previous change... #define NOMINMAX isn't a good idea either.
................
  r44474 | nasonov | 2008-04-16 14:13:25 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Use make_unsigned and get rid of gcc warnings when -DBOOST_LEXICAL_CAST_ASSUME_C_LOCALE
................
  r44475 | hkaiser | 2008-04-16 15:50:47 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Spirit V2: started to address regression test failures
................
  r44476 | emildotchevski | 2008-04-16 15:55:19 -0700 (Wed, 16 Apr 2008) | 1 line
  
  minor documentation fixes.
................
  r44477 | hkaiser | 2008-04-16 15:56:15 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Wave: fixed a newly introduced compilation error specific to certain platforms.
................
  r44478 | hkaiser | 2008-04-16 16:17:24 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Spirit V2: Fixed more regression problems.
................
  r44479 | hkaiser | 2008-04-16 16:18:18 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Wave: minor edits...
................
  r44480 | jurko | 2008-04-16 17:20:33 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Added a workaround for a compilation failure when including some Boost Serialization headers before some Boost Pool headers using MSVC 7.1 or 8.0. Source of the problem is a compiler bug fixed in MSVC 9.0 and workaround consists of referencing some Windows API identifiers using their fully qualified names. Added a related regression test for the Boost Pool library. See the test code comments for more detailed information on the bug.
................
  r44481 | jurko | 2008-04-16 17:27:30 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Corrected the documentation related to installing new internal property types.
................
  r44482 | hkaiser | 2008-04-16 18:04:19 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Wave: minor edits...
................
  r44483 | hkaiser | 2008-04-16 18:56:25 -0700 (Wed, 16 Apr 2008) | 1 line
  
  Wave: Fixed slex test
................
  r44484 | hkaiser | 2008-04-16 19:00:20 -0700 (Wed, 16 Apr 2008) | 2 lines
  
  Wave: Fixed slex test
................
  r44486 | danieljames | 2008-04-17 00:34:15 -0700 (Thu, 17 Apr 2008) | 35 lines
  
  Movable unordered containers, full support only for compilers with rvalue references.
  
  Merged revisions 44076-44414 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44076 | danieljames | 2008-04-06 20:41:19 +0100 (Sun, 06 Apr 2008) | 1 line
    
    Move semantics for compilers with rvalue references.
  ........
    r44077 | danieljames | 2008-04-06 20:48:59 +0100 (Sun, 06 Apr 2008) | 1 line
    
    Do move assignment 'properly'.
  ........
    r44085 | danieljames | 2008-04-06 22:46:04 +0100 (Sun, 06 Apr 2008) | 1 line
    
    Use normal references for the move members, reset the source buckets_ pointer to stop the buckets getting deleted, and remove a superflous pointer check.
  ........
    r44109 | danieljames | 2008-04-07 23:49:36 +0100 (Mon, 07 Apr 2008) | 1 line
    
    Add missing tests.
  ........
    r44366 | danieljames | 2008-04-13 12:59:46 +0100 (Sun, 13 Apr 2008) | 1 line
    
    Avoid using rvalue references in the implementation files.
  ........
    r44368 | danieljames | 2008-04-13 15:13:33 +0100 (Sun, 13 Apr 2008) | 6 lines
    
    Use a cut down version of the work in progress move library to implement move
    semantics on more compilers. Unfortunately the move constructor with allocator
    isn't really practical at the moment, since in the case where the container
    can't be moved, and the allocators aren't equal it will copy the container
    twice.
  ........
................
  r44487 | danieljames | 2008-04-17 00:39:24 -0700 (Thu, 17 Apr 2008) | 13 lines
  
  Use Boost.Test's minimal test library for unordered & hash. It's closer to
  Boster.Test which makes it easier to switch to take advantage of Boost.Test's
  extra testing facilities.
  
  Merged revisions 44420 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44420 | danieljames | 2008-04-14 19:02:03 +0100 (Mon, 14 Apr 2008) | 1 line
    
    Use Boost.Test's minimal test library.
  ........
................
  r44488 | danieljames | 2008-04-17 00:42:47 -0700 (Thu, 17 Apr 2008) | 19 lines
  
  A few tweaks for the unordered tests.
  
  Merged revisions 44461-44462,44466 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44461 | danieljames | 2008-04-16 18:34:48 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Try to get some more tests working on Borland.
  ........
    r44462 | danieljames | 2008-04-16 18:34:59 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Write out the number of copies when the unnecessary copy test fails.
  ........
    r44466 | danieljames | 2008-04-16 18:35:44 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Add compile test for get_allocator.
  ........
................
  r44489 | danieljames | 2008-04-17 00:45:20 -0700 (Thu, 17 Apr 2008) | 36 lines
  
  Refactor the hash table implementation a little bit. Some of the changes are to
  make implementing emplace easier.
  
  Merged revisions 44458-44460,44463-44465 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44458 | danieljames | 2008-04-16 18:31:35 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Pull out the buffered functions.
  ........
    r44459 | danieljames | 2008-04-16 18:31:45 +0100 (Wed, 16 Apr 2008) | 4 lines
    
    Inline construct_node and create_node into copy_group - these used to be used
    in the implementation of insert but aren't now because of insert's exception
    requirements, so keeping them around was just confusing.
  ........
    r44460 | danieljames | 2008-04-16 18:31:54 +0100 (Wed, 16 Apr 2008) | 4 lines
    
    Change link_node so that it takes a node_constructor containing a constructed
    node instead of a node - this makes the code a little cleaner and also
    simplifies exception safety.
  ........
    r44463 | danieljames | 2008-04-16 18:35:11 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Explicitly name the different insert overloads.
  ........
    r44464 | danieljames | 2008-04-16 18:35:22 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Explicitly name the different erase overloads.
  ........
    r44465 | danieljames | 2008-04-16 18:35:33 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Call the erase methods in hash_table_data directly.
  ........
................
  r44490 | danieljames | 2008-04-17 00:49:45 -0700 (Thu, 17 Apr 2008) | 11 lines
  
  Fix an error on compilers without SFINAE.
  
  Merged revisions 44470 via svnmerge from 
  https://svn.boost.org/svn/boost/branches/unordered/trunk
  
  ........
    r44470 | danieljames | 2008-04-16 18:36:26 +0100 (Wed, 16 Apr 2008) | 2 lines
    
    Missing semi-colon.
  ........
................
  r44491 | djowel | 2008-04-17 02:01:51 -0700 (Thu, 17 Apr 2008) | 1 line
  
  char-sets
................
  r44492 | djowel | 2008-04-17 02:02:03 -0700 (Thu, 17 Apr 2008) | 1 line
  
  char-sets
................
  r44493 | djowel | 2008-04-17 02:44:31 -0700 (Thu, 17 Apr 2008) | 1 line
  
  fixed redundancy in namespace qi::detail::detail
................
  r44495 | jurko | 2008-04-17 04:56:16 -0700 (Thu, 17 Apr 2008) | 1 line
  
  Removed an extra unused 'executed' feature attribute.
................
  r44496 | hkaiser | 2008-04-17 05:22:33 -0700 (Thu, 17 Apr 2008) | 1 line
  
  Spirit V2: Fixed a gcc complaint
................
  r44497 | hkaiser | 2008-04-17 05:29:18 -0700 (Thu, 17 Apr 2008) | 1 line
  
  Spirit V2: Fixed a gcc complaint
................
  r44499 | fmhess | 2008-04-17 06:40:44 -0700 (Thu, 17 Apr 2008) | 3 lines
  
  Added another BOOST_ASSERT to enable_shared_from_this::_internal_accept_owner.
................
  r44506 | johnmaddock | 2008-04-17 08:49:39 -0700 (Thu, 17 Apr 2008) | 1 line
  
  Change <functional> include so that it still works when Boost.TR1 is in the include path.
................
  r44507 | johnmaddock | 2008-04-17 09:21:04 -0700 (Thu, 17 Apr 2008) | 1 line
  
  Try and fix the remaining Intel-Linux failures.
................


[SVN r44523]
2008-04-17 21:50:51 +00:00
fc782cd4fe post-review proto version
[SVN r44061]
2008-04-05 18:00:00 +00:00
15 changed files with 187 additions and 223 deletions

22
CMakeLists.txt Normal file
View File

@ -0,0 +1,22 @@
#----------------------------------------------------------------------------
# This file was automatically generated from the original CMakeLists.txt file
# Add a variable to hold the headers for the library
set (lib_headers
function.hpp
function
)
# Add a library target to the build system
boost_library_project(
function
# SRCDIRS
TESTDIRS test
HEADERS ${lib_headers}
DOCDIRS doc
# DESCRIPTION
MODULARIZED
# AUTHORS
# MAINTAINERS
)

2
doc/CMakeLists.txt Normal file
View File

@ -0,0 +1,2 @@
boost_add_documentation(function.xml
faq.xml history.xml misc.xml reference.xml tests.xml tutorial.xml)

View File

@ -6,11 +6,5 @@
project boost/doc ; project boost/doc ;
import boostbook : boostbook ; import boostbook : boostbook ;
boostbook function-doc boostbook function-doc : function.xml ;
:
function.xml
:
<xsl:param>boost.root=../../../..
<format>pdf:<xsl:param>boost.url.prefix=http://www.boost.org/doc/libs/release/doc/html
;

View File

@ -35,12 +35,12 @@ form to use for your compiler.
<row> <row>
<entry> <entry>
<itemizedlist spacing="compact"> <itemizedlist spacing="compact">
<listitem><simpara>GNU C++ 2.95.x, 3.0.x and later versions</simpara></listitem> <listitem><simpara>GNU C++ 2.95.x, 3.0.x, 3.1.x</simpara></listitem>
<listitem><simpara>Comeau C++ 4.2.45.2</simpara></listitem> <listitem><simpara>Comeau C++ 4.2.45.2</simpara></listitem>
<listitem><simpara>SGI MIPSpro 7.3.0</simpara></listitem> <listitem><simpara>SGI MIPSpro 7.3.0</simpara></listitem>
<listitem><simpara>Intel C++ 5.0, 6.0</simpara></listitem> <listitem><simpara>Intel C++ 5.0, 6.0</simpara></listitem>
<listitem><simpara>Compaq's cxx 6.2</simpara></listitem> <listitem><simpara>Compaq's cxx 6.2</simpara></listitem>
<listitem><simpara>Microsoft Visual C++ 7.1 and later versions</simpara></listitem> <listitem><simpara>Microsoft Visual C++ 7.1</simpara></listitem>
</itemizedlist> </itemizedlist>
</entry> </entry>
<entry> <entry>

View File

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

View File

@ -15,12 +15,9 @@
#include <string> #include <string>
#include <memory> #include <memory>
#include <new> #include <new>
#include <typeinfo>
#include <boost/config.hpp> #include <boost/config.hpp>
#include <boost/detail/sp_typeinfo.hpp>
#include <boost/assert.hpp> #include <boost/assert.hpp>
#include <boost/integer.hpp>
#include <boost/type_traits/has_trivial_copy.hpp>
#include <boost/type_traits/has_trivial_destructor.hpp>
#include <boost/type_traits/is_const.hpp> #include <boost/type_traits/is_const.hpp>
#include <boost/type_traits/is_integral.hpp> #include <boost/type_traits/is_integral.hpp>
#include <boost/type_traits/is_volatile.hpp> #include <boost/type_traits/is_volatile.hpp>
@ -54,9 +51,7 @@
// Borrowed from Boost.Python library: determines the cases where we // Borrowed from Boost.Python library: determines the cases where we
// need to use std::type_info::name to compare instead of operator==. // need to use std::type_info::name to compare instead of operator==.
#if defined( BOOST_NO_TYPEID ) # if (defined(__GNUC__) && __GNUC__ >= 3) \
# define BOOST_FUNCTION_COMPARE_TYPE_ID(X,Y) ((X)==(Y))
#elif (defined(__GNUC__) && __GNUC__ >= 3) \
|| defined(_AIX) \ || defined(_AIX) \
|| ( defined(__sgi) && defined(__host_mips)) || ( defined(__sgi) && defined(__host_mips))
# include <cstring> # include <cstring>
@ -105,7 +100,7 @@ namespace boost {
// For pointers to std::type_info objects // For pointers to std::type_info objects
struct type_t { struct type_t {
// (get_functor_type_tag, check_functor_type_tag). // (get_functor_type_tag, check_functor_type_tag).
const detail::sp_typeinfo* type; const BOOST_FUNCTION_STD_NS::type_info* type;
// Whether the type is const-qualified. // Whether the type is const-qualified.
bool const_qualified; bool const_qualified;
@ -203,11 +198,11 @@ namespace boost {
{ {
switch (op) { switch (op) {
case clone_functor_tag: 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; return;
case move_functor_tag: 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; in_buffer.obj_ref.obj_ptr = 0;
return; return;
@ -217,12 +212,12 @@ namespace boost {
case check_functor_type_tag: case check_functor_type_tag:
{ {
const detail::sp_typeinfo& check_type const BOOST_FUNCTION_STD_NS::type_info& check_type
= *out_buffer.type.type; = *out_buffer.type.type;
// Check whether we have the same type. We can add // Check whether we have the same type. We can add
// cv-qualifiers, but we can't take them away. // cv-qualifiers, but we can't take them away.
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(F)) if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(F))
&& (!in_buffer.obj_ref.is_const_qualified && (!in_buffer.obj_ref.is_const_qualified
|| out_buffer.type.const_qualified) || out_buffer.type.const_qualified)
&& (!in_buffer.obj_ref.is_volatile_qualified && (!in_buffer.obj_ref.is_volatile_qualified
@ -234,7 +229,7 @@ namespace boost {
return; return;
case get_functor_type_tag: case get_functor_type_tag:
out_buffer.type.type = &BOOST_SP_TYPEID(F); out_buffer.type.type = &typeid(F);
out_buffer.type.const_qualified = in_buffer.obj_ref.is_const_qualified; out_buffer.type.const_qualified = in_buffer.obj_ref.is_const_qualified;
out_buffer.type.volatile_qualified = in_buffer.obj_ref.is_volatile_qualified; out_buffer.type.volatile_qualified = in_buffer.obj_ref.is_volatile_qualified;
return; return;
@ -264,12 +259,6 @@ namespace boost {
A(a) A(a)
{ {
} }
functor_wrapper(const functor_wrapper& f) :
F(static_cast<const F&>(f)),
A(static_cast<const A&>(f))
{
}
}; };
/** /**
@ -294,14 +283,14 @@ namespace boost {
} else if (op == destroy_functor_tag) } else if (op == destroy_functor_tag)
out_buffer.func_ptr = 0; out_buffer.func_ptr = 0;
else if (op == check_functor_type_tag) { else if (op == check_functor_type_tag) {
const detail::sp_typeinfo& check_type const BOOST_FUNCTION_STD_NS::type_info& check_type
= *out_buffer.type.type; = *out_buffer.type.type;
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
out_buffer.obj_ptr = &in_buffer.func_ptr; out_buffer.obj_ptr = &in_buffer.func_ptr;
else else
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else /* op == get_functor_type_tag */ { } else /* op == get_functor_type_tag */ {
out_buffer.type.type = &BOOST_SP_TYPEID(Functor); out_buffer.type.type = &typeid(Functor);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
} }
@ -315,27 +304,23 @@ namespace boost {
if (op == clone_functor_tag || op == move_functor_tag) { if (op == clone_functor_tag || op == move_functor_tag) {
const functor_type* in_functor = const functor_type* in_functor =
reinterpret_cast<const functor_type*>(&in_buffer.data); 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) { if (op == move_functor_tag) {
functor_type* f = reinterpret_cast<functor_type*>(&in_buffer.data); reinterpret_cast<functor_type*>(&in_buffer.data)->~Functor();
(void)f; // suppress warning about the value of f not being used (MSVC)
f->~Functor();
} }
} else if (op == destroy_functor_tag) { } else if (op == destroy_functor_tag) {
// Some compilers (Borland, vc6, ...) are unhappy with ~functor_type. // Some compilers (Borland, vc6, ...) are unhappy with ~functor_type.
functor_type* f = reinterpret_cast<functor_type*>(&out_buffer.data); reinterpret_cast<functor_type*>(&out_buffer.data)->~Functor();
(void)f; // suppress warning about the value of f not being used (MSVC)
f->~Functor();
} else if (op == check_functor_type_tag) { } else if (op == check_functor_type_tag) {
const detail::sp_typeinfo& check_type const BOOST_FUNCTION_STD_NS::type_info& check_type
= *out_buffer.type.type; = *out_buffer.type.type;
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
out_buffer.obj_ptr = &in_buffer.data; out_buffer.obj_ptr = &in_buffer.data;
else else
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else /* op == get_functor_type_tag */ { } else /* op == get_functor_type_tag */ {
out_buffer.type.type = &BOOST_SP_TYPEID(Functor); out_buffer.type.type = &typeid(Functor);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
} }
@ -373,10 +358,8 @@ namespace boost {
// Clone the functor // Clone the functor
// GCC 2.95.3 gets the CV qualifiers wrong here, so we // GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do. // 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 = 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); functor_type* new_f = new functor_type(*f);
out_buffer.obj_ptr = new_f; out_buffer.obj_ptr = new_f;
} else if (op == move_functor_tag) { } else if (op == move_functor_tag) {
@ -389,14 +372,14 @@ namespace boost {
delete f; delete f;
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else if (op == check_functor_type_tag) { } else if (op == check_functor_type_tag) {
const detail::sp_typeinfo& check_type const BOOST_FUNCTION_STD_NS::type_info& check_type
= *out_buffer.type.type; = *out_buffer.type.type;
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
out_buffer.obj_ptr = in_buffer.obj_ptr; out_buffer.obj_ptr = in_buffer.obj_ptr;
else else
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else /* op == get_functor_type_tag */ { } else /* op == get_functor_type_tag */ {
out_buffer.type.type = &BOOST_SP_TYPEID(Functor); out_buffer.type.type = &typeid(Functor);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
} }
@ -431,7 +414,7 @@ namespace boost {
typedef typename get_function_tag<functor_type>::type tag_type; typedef typename get_function_tag<functor_type>::type tag_type;
switch (op) { switch (op) {
case get_functor_type_tag: case get_functor_type_tag:
out_buffer.type.type = &BOOST_SP_TYPEID(functor_type); out_buffer.type.type = &typeid(functor_type);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
return; return;
@ -480,7 +463,7 @@ namespace boost {
// GCC 2.95.3 gets the CV qualifiers wrong here, so we // GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do. // can't do the static_cast that we should do.
const functor_wrapper_type* f = 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_type wrapper_allocator(static_cast<Allocator const &>(*f));
wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1); wrapper_allocator_pointer_type copy = wrapper_allocator.allocate(1);
wrapper_allocator.construct(copy, *f); wrapper_allocator.construct(copy, *f);
@ -500,14 +483,14 @@ namespace boost {
wrapper_allocator.deallocate(victim,1); wrapper_allocator.deallocate(victim,1);
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else if (op == check_functor_type_tag) { } else if (op == check_functor_type_tag) {
const detail::sp_typeinfo& check_type const BOOST_FUNCTION_STD_NS::type_info& check_type
= *out_buffer.type.type; = *out_buffer.type.type;
if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, BOOST_SP_TYPEID(Functor))) if (BOOST_FUNCTION_COMPARE_TYPE_ID(check_type, typeid(Functor)))
out_buffer.obj_ptr = in_buffer.obj_ptr; out_buffer.obj_ptr = in_buffer.obj_ptr;
else else
out_buffer.obj_ptr = 0; out_buffer.obj_ptr = 0;
} else /* op == get_functor_type_tag */ { } else /* op == get_functor_type_tag */ {
out_buffer.type.type = &BOOST_SP_TYPEID(Functor); out_buffer.type.type = &typeid(Functor);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
} }
@ -534,7 +517,7 @@ namespace boost {
typedef typename get_function_tag<functor_type>::type tag_type; typedef typename get_function_tag<functor_type>::type tag_type;
switch (op) { switch (op) {
case get_functor_type_tag: case get_functor_type_tag:
out_buffer.type.type = &BOOST_SP_TYPEID(functor_type); out_buffer.type.type = &typeid(functor_type);
out_buffer.type.const_qualified = false; out_buffer.type.const_qualified = false;
out_buffer.type.volatile_qualified = false; out_buffer.type.volatile_qualified = false;
return; return;
@ -635,14 +618,14 @@ public:
/** Determine if the function is empty (i.e., has no target). */ /** Determine if the function is empty (i.e., has no target). */
bool empty() const { return !vtable; } bool empty() const { return !vtable; }
/** Retrieve the type of the stored function object, or BOOST_SP_TYPEID(void) /** Retrieve the type of the stored function object, or typeid(void)
if this is empty. */ if this is empty. */
const detail::sp_typeinfo& target_type() const const BOOST_FUNCTION_STD_NS::type_info& target_type() const
{ {
if (!vtable) return BOOST_SP_TYPEID(void); if (!vtable) return typeid(void);
detail::function::function_buffer type; detail::function::function_buffer type;
get_vtable()->manager(functor, type, detail::function::get_functor_type_tag); vtable->manager(functor, type, detail::function::get_functor_type_tag);
return *type.type.type; return *type.type.type;
} }
@ -652,10 +635,10 @@ public:
if (!vtable) return 0; if (!vtable) return 0;
detail::function::function_buffer type_result; detail::function::function_buffer type_result;
type_result.type.type = &BOOST_SP_TYPEID(Functor); type_result.type.type = &typeid(Functor);
type_result.type.const_qualified = is_const<Functor>::value; type_result.type.const_qualified = is_const<Functor>::value;
type_result.type.volatile_qualified = is_volatile<Functor>::value; type_result.type.volatile_qualified = is_volatile<Functor>::value;
get_vtable()->manager(functor, type_result, vtable->manager(functor, type_result,
detail::function::check_functor_type_tag); detail::function::check_functor_type_tag);
return static_cast<Functor*>(type_result.obj_ptr); return static_cast<Functor*>(type_result.obj_ptr);
} }
@ -670,14 +653,14 @@ public:
if (!vtable) return 0; if (!vtable) return 0;
detail::function::function_buffer type_result; detail::function::function_buffer type_result;
type_result.type.type = &BOOST_SP_TYPEID(Functor); type_result.type.type = &typeid(Functor);
type_result.type.const_qualified = true; type_result.type.const_qualified = true;
type_result.type.volatile_qualified = is_volatile<Functor>::value; type_result.type.volatile_qualified = is_volatile<Functor>::value;
get_vtable()->manager(functor, type_result, vtable->manager(functor, type_result,
detail::function::check_functor_type_tag); detail::function::check_functor_type_tag);
// GCC 2.95.3 gets the CV qualifiers wrong here, so we // GCC 2.95.3 gets the CV qualifiers wrong here, so we
// can't do the static_cast that we should do. // 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> template<typename F>
@ -719,15 +702,6 @@ public:
#endif #endif
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::vtable_base* get_vtable() const {
return reinterpret_cast<detail::function::vtable_base*>(
reinterpret_cast<std::size_t>(vtable) & ~static_cast<std::size_t>(0x01));
}
bool has_trivial_copy_and_destroy() const {
return reinterpret_cast<std::size_t>(vtable) & 0x01;
}
detail::function::vtable_base* vtable; detail::function::vtable_base* vtable;
mutable detail::function::function_buffer functor; mutable detail::function::function_buffer functor;
}; };
@ -903,8 +877,4 @@ namespace detail {
#undef BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL #undef BOOST_FUNCTION_ENABLE_IF_NOT_INTEGRAL
#undef BOOST_FUNCTION_COMPARE_TYPE_ID #undef BOOST_FUNCTION_COMPARE_TYPE_ID
#if defined(BOOST_MSVC)
# pragma warning( pop )
#endif
#endif // BOOST_FUNCTION_BASE_HEADER #endif // BOOST_FUNCTION_BASE_HEADER

View File

@ -21,7 +21,7 @@ namespace boost { namespace python { namespace objects {
#if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \ #if defined (BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) \
|| defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) \ || defined(BOOST_BCB_PARTIAL_SPECIALIZATION_BUG) \
|| !(defined(BOOST_STRICT_CONFIG) || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540) || !(BOOST_STRICT_CONFIG || !defined(__SUNPRO_CC) || __SUNPRO_CC > 0x540)
# define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX # define BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX
#endif #endif

View File

@ -11,7 +11,6 @@
// Note: this header is a header template and must NOT have multiple-inclusion // Note: this header is a header template and must NOT have multiple-inclusion
// protection. // protection.
#include <boost/function/detail/prologue.hpp> #include <boost/function/detail/prologue.hpp>
#include <boost/detail/no_exceptions_support.hpp>
#if defined(BOOST_MSVC) #if defined(BOOST_MSVC)
# pragma warning( push ) # pragma warning( push )
@ -486,19 +485,19 @@ namespace boost {
BOOST_FUNCTION_TEMPLATE_ARGS); BOOST_FUNCTION_TEMPLATE_ARGS);
template<typename F> 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; typedef typename get_function_tag<F>::type tag;
return assign_to(f, functor, tag()); return assign_to(f, functor, tag());
} }
template<typename F,typename Allocator> 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; typedef typename get_function_tag<F>::type tag;
return assign_to_a(f, functor, a, tag()); return assign_to_a(f, functor, a, tag());
} }
void clear(function_buffer& functor) const void clear(function_buffer& functor)
{ {
if (base.manager) if (base.manager)
base.manager(functor, functor, destroy_functor_tag); base.manager(functor, functor, destroy_functor_tag);
@ -508,13 +507,13 @@ namespace boost {
// Function pointers // Function pointers
template<typename FunctionPtr> template<typename FunctionPtr>
bool 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); this->clear(functor);
if (f) { if (f) {
// should be a reinterpret cast, but some compilers insist // should be a reinterpret cast, but some compilers insist
// on giving cv-qualifiers to free functions // on giving cv-qualifiers to free functions
functor.func_ptr = reinterpret_cast<void (*)()>(f); functor.func_ptr = (void (*)())(f);
return true; return true;
} else { } else {
return false; return false;
@ -522,7 +521,7 @@ namespace boost {
} }
template<typename FunctionPtr,typename Allocator> template<typename FunctionPtr,typename Allocator>
bool 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()); return assign_to(f,functor,function_ptr_tag());
} }
@ -530,26 +529,26 @@ namespace boost {
// Member pointers // Member pointers
#if BOOST_FUNCTION_NUM_ARGS > 0 #if BOOST_FUNCTION_NUM_ARGS > 0
template<typename MemberPtr> 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 // DPG TBD: Add explicit support for member function
// objects, so we invoke through mem_fn() but we retain the // objects, so we invoke through mem_fn() but we retain the
// right target_type() values. // right target_type() values.
if (f) { if (f) {
this->assign_to(boost::mem_fn(f), functor); this->assign_to(mem_fn(f), functor);
return true; return true;
} else { } else {
return false; return false;
} }
} }
template<typename MemberPtr,typename Allocator> 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 // DPG TBD: Add explicit support for member function
// objects, so we invoke through mem_fn() but we retain the // objects, so we invoke through mem_fn() but we retain the
// right target_type() values. // right target_type() values.
if (f) { if (f) {
this->assign_to_a(boost::mem_fn(f), functor, a); this->assign_to_a(mem_fn(f), functor, a);
return true; return true;
} else { } else {
return false; return false;
@ -561,13 +560,13 @@ namespace boost {
// Assign to a function object using the small object optimization // Assign to a function object using the small object optimization
template<typename FunctionObj> template<typename FunctionObj>
void 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> template<typename FunctionObj,typename Allocator>
void 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_()); assign_functor(f,functor,mpl::true_());
} }
@ -575,13 +574,13 @@ namespace boost {
// Assign to a function object allocated on the heap. // Assign to a function object allocated on the heap.
template<typename FunctionObj> template<typename FunctionObj>
void 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); functor.obj_ptr = new FunctionObj(f);
} }
template<typename FunctionObj,typename Allocator> template<typename FunctionObj,typename Allocator>
void 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 functor_wrapper<FunctionObj,Allocator> functor_wrapper_type;
typedef typename Allocator::template rebind<functor_wrapper_type>::other typedef typename Allocator::template rebind<functor_wrapper_type>::other
@ -596,7 +595,7 @@ namespace boost {
template<typename FunctionObj> template<typename FunctionObj>
bool 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))) { if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
assign_functor(f, functor, assign_functor(f, functor,
@ -608,7 +607,7 @@ namespace boost {
} }
template<typename FunctionObj,typename Allocator> template<typename FunctionObj,typename Allocator>
bool 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))) { if (!boost::detail::function::has_empty_target(boost::addressof(f))) {
assign_functor_a(f, functor, a, assign_functor_a(f, functor, a,
@ -623,17 +622,21 @@ namespace boost {
template<typename FunctionObj> template<typename FunctionObj>
bool bool
assign_to(const reference_wrapper<FunctionObj>& f, 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()); if (!boost::detail::function::has_empty_target(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_const_qualified = is_const<FunctionObj>::value;
functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value; functor.obj_ref.is_volatile_qualified = is_volatile<FunctionObj>::value;
return true; return true;
} else {
return false;
}
} }
template<typename FunctionObj,typename Allocator> template<typename FunctionObj,typename Allocator>
bool bool
assign_to_a(const reference_wrapper<FunctionObj>& f, 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()); return assign_to(f,functor,function_obj_ref_tag());
} }
@ -675,11 +678,6 @@ namespace boost {
R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS> R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_ARGS>
vtable_type; vtable_type;
vtable_type* get_vtable() const {
return reinterpret_cast<vtable_type*>(
reinterpret_cast<std::size_t>(vtable) & ~static_cast<size_t>(0x01));
}
struct clear_type {}; struct clear_type {};
public: public:
@ -751,14 +749,20 @@ namespace boost {
~BOOST_FUNCTION_FUNCTION() { clear(); } ~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 result_type operator()(BOOST_FUNCTION_PARMS) const
{ {
if (this->empty()) if (this->empty())
boost::throw_exception(bad_function_call()); boost::throw_exception(bad_function_call());
return get_vtable()->invoker return static_cast<vtable_type*>(vtable)->invoker
(this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS); (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 // The distinction between when to use BOOST_FUNCTION_FUNCTION and
// when to use self_type is obnoxious. MSVC cannot handle self_type as // when to use self_type is obnoxious. MSVC cannot handle self_type as
@ -777,26 +781,24 @@ namespace boost {
operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f) operator=(Functor BOOST_FUNCTION_TARGET_FIX(const &) f)
{ {
this->clear(); this->clear();
BOOST_TRY { try {
this->assign_to(f); this->assign_to(f);
} BOOST_CATCH (...) { } catch (...) {
vtable = 0; vtable = 0;
BOOST_RETHROW; throw;
} }
BOOST_CATCH_END
return *this; return *this;
} }
template<typename Functor,typename Allocator> template<typename Functor,typename Allocator>
void assign(Functor BOOST_FUNCTION_TARGET_FIX(const &) f, Allocator a) void assign(Functor BOOST_FUNCTION_TARGET_FIX(const &) f, Allocator a)
{ {
this->clear(); this->clear();
BOOST_TRY{ try {
this->assign_to_a(f,a); this->assign_to_a(f,a);
} BOOST_CATCH (...) { } catch (...) {
vtable = 0; vtable = 0;
BOOST_RETHROW; throw;
} }
BOOST_CATCH_END
} }
#ifndef BOOST_NO_SFINAE #ifndef BOOST_NO_SFINAE
@ -821,13 +823,12 @@ namespace boost {
return *this; return *this;
this->clear(); this->clear();
BOOST_TRY { try {
this->assign_to_own(f); this->assign_to_own(f);
} BOOST_CATCH (...) { } catch (...) {
vtable = 0; vtable = 0;
BOOST_RETHROW; throw;
} }
BOOST_CATCH_END
return *this; return *this;
} }
@ -846,8 +847,7 @@ namespace boost {
void clear() void clear()
{ {
if (vtable) { if (vtable) {
if (!this->has_trivial_copy_and_destroy()) reinterpret_cast<vtable_type*>(vtable)->clear(this->functor);
get_vtable()->clear(this->functor);
vtable = 0; vtable = 0;
} }
} }
@ -858,7 +858,7 @@ namespace boost {
#else #else
private: private:
struct dummy { struct dummy {
void nonnull() {} void nonnull() {};
}; };
typedef void (dummy::*safe_bool)(); typedef void (dummy::*safe_bool)();
@ -876,10 +876,7 @@ namespace boost {
{ {
if (!f.empty()) { if (!f.empty()) {
this->vtable = f.vtable; this->vtable = f.vtable;
if (this->has_trivial_copy_and_destroy()) f.vtable->manager(f.functor, this->functor,
this->functor = f.functor;
else
get_vtable()->base.manager(f.functor, this->functor,
boost::detail::function::clone_functor_tag); boost::detail::function::clone_functor_tag);
} }
} }
@ -903,18 +900,11 @@ namespace boost {
// static initialization. Otherwise, we will have a race // static initialization. Otherwise, we will have a race
// condition here in multi-threaded code. See // condition here in multi-threaded code. See
// http://thread.gmane.org/gmane.comp.lib.boost.devel/164902/. // 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 }; { { &manager_type::manage }, &invoker_type::invoke };
if (stored_vtable.assign_to(f, functor)) { if (stored_vtable.assign_to(f, functor)) vtable = &stored_vtable.base;
std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base); else vtable = 0;
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);
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
} else
vtable = 0;
} }
template<typename Functor,typename Allocator> template<typename Functor,typename Allocator>
@ -937,18 +927,11 @@ namespace boost {
// static initialization. Otherwise, we will have a race // static initialization. Otherwise, we will have a race
// condition here in multi-threaded code. See // condition here in multi-threaded code. See
// http://thread.gmane.org/gmane.comp.lib.boost.devel/164902/. // 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 }; { { &manager_type::manage }, &invoker_type::invoke };
if (stored_vtable.assign_to_a(f, functor, a)) { if (stored_vtable.assign_to_a(f, functor, a)) vtable = &stored_vtable.base;
std::size_t value = reinterpret_cast<std::size_t>(&stored_vtable.base); else vtable = 0;
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);
vtable = reinterpret_cast<detail::function::vtable_base *>(value);
} else
vtable = 0;
} }
// Moves the value from the specified argument to *this. If the argument // Moves the value from the specified argument to *this. If the argument
@ -959,23 +942,23 @@ namespace boost {
if (&f == this) if (&f == this)
return; return;
BOOST_TRY { #if !defined(BOOST_NO_EXCEPTIONS)
try {
#endif
if (!f.empty()) { if (!f.empty()) {
this->vtable = f.vtable; this->vtable = f.vtable;
if (this->has_trivial_copy_and_destroy()) f.vtable->manager(f.functor, this->functor,
this->functor = f.functor;
else
get_vtable()->base.manager(f.functor, this->functor,
boost::detail::function::move_functor_tag); boost::detail::function::move_functor_tag);
f.vtable = 0; f.vtable = 0;
#if !defined(BOOST_NO_EXCEPTIONS)
} else { } else {
clear(); clear();
} }
} BOOST_CATCH (...) { } catch (...) {
vtable = 0; vtable = 0;
BOOST_RETHROW; throw;
} }
BOOST_CATCH_END #endif
} }
}; };
@ -992,6 +975,21 @@ namespace boost {
f1.swap(f2); 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
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 reinterpret_cast<const vtable_type*>(vtable)->invoker
(this->functor BOOST_FUNCTION_COMMA BOOST_FUNCTION_ARGS);
}
#endif
// Poison comparisons between boost::function objects of the same type. // Poison comparisons between boost::function objects of the same type.
template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS> template<typename R BOOST_FUNCTION_COMMA BOOST_FUNCTION_TEMPLATE_PARMS>
void operator==(const BOOST_FUNCTION_FUNCTION< void operator==(const BOOST_FUNCTION_FUNCTION<

20
test/CMakeLists.txt Normal file
View File

@ -0,0 +1,20 @@
boost_test_run(lib_function_test function_test.cpp)
boost_test_run(function_n_test)
boost_test_run(allocator_test)
boost_test_run(stateless_test)
boost_test_run(lambda_test)
boost_test_compile_fail(function_test_fail1)
boost_test_compile_fail(function_test_fail2)
boost_test_compile(function_30)
boost_test_run(function_arith_cxx98)
boost_test_run(function_arith_portable)
boost_test_run(sum_avg_cxx98)
boost_test_run(sum_avg_portable)
boost_test_run(mem_fun_cxx98)
boost_test_run(mem_fun_portable)
boost_test_run(std_bind_cxx98)
boost_test_run(std_bind_portable)
boost_test_run(function_ref_cxx98)
boost_test_run(function_ref_portable)
boost_test_run(contains_test)
boost_test_run(contains2_test)

View File

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

View File

@ -129,9 +129,5 @@ test_main(int, char*[])
fv.assign( &do_nothing, std::allocator<int>() ); fv.assign( &do_nothing, std::allocator<int>() );
fv.clear(); fv.clear();
function0<void> fv2;
fv.assign(&do_nothing, std::allocator<int>() );
fv2.assign(fv, std::allocator<int>() );
return 0; return 0;
} }

View File

@ -13,8 +13,8 @@
#include <string> #include <string>
#include <utility> #include <utility>
using boost::function; using namespace boost;
using std::string; using namespace std;
int global_int; int global_int;
@ -525,7 +525,7 @@ test_zero_args()
static void static void
test_one_arg() test_one_arg()
{ {
std::negate<int> neg; negate<int> neg;
function<int (int)> f1(neg); function<int (int)> f1(neg);
BOOST_CHECK(f1(5) == -5); BOOST_CHECK(f1(5) == -5);
@ -607,12 +607,12 @@ struct add_with_throw_on_copy {
add_with_throw_on_copy(const add_with_throw_on_copy&) add_with_throw_on_copy(const add_with_throw_on_copy&)
{ {
throw std::runtime_error("But this CAN'T throw"); throw runtime_error("But this CAN'T throw");
} }
add_with_throw_on_copy& operator=(const add_with_throw_on_copy&) add_with_throw_on_copy& operator=(const add_with_throw_on_copy&)
{ {
throw std::runtime_error("But this CAN'T throw"); throw runtime_error("But this CAN'T throw");
} }
}; };
@ -621,38 +621,14 @@ test_ref()
{ {
add_with_throw_on_copy atc; add_with_throw_on_copy atc;
try { try {
boost::function<int (int, int)> f(boost::ref(atc)); boost::function<int (int, int)> f(ref(atc));
BOOST_CHECK(f(1, 3) == 4); BOOST_CHECK(f(1, 3) == 4);
} }
catch(std::runtime_error e) { catch(runtime_error e) {
BOOST_ERROR("Nonthrowing constructor threw an exception"); BOOST_ERROR("Nonthrowing constructor threw an exception");
} }
} }
static void dummy() {}
static void test_empty_ref()
{
boost::function<void()> f1;
boost::function<void()> f2(boost::ref(f1));
try {
f2();
BOOST_ERROR("Exception didn't throw for reference to empty function.");
}
catch(std::runtime_error e) {}
f1 = dummy;
try {
f2();
}
catch(std::runtime_error e) {
BOOST_ERROR("Error calling referenced function.");
}
}
static void test_exception() static void test_exception()
{ {
boost::function<int (int, int)> f; boost::function<int (int, int)> f;
@ -698,7 +674,6 @@ int test_main(int, char* [])
test_emptiness(); test_emptiness();
test_member_functions(); test_member_functions();
test_ref(); test_ref();
test_empty_ref();
test_exception(); test_exception();
test_implicit(); test_implicit();
test_call(); test_call();

View File

@ -15,21 +15,21 @@
#include <boost/lambda/bind.hpp> #include <boost/lambda/bind.hpp>
#include <boost/function.hpp> #include <boost/function.hpp>
using namespace std;
using namespace boost;
using namespace boost::lambda;
static unsigned static unsigned
func_impl(int arg1, bool arg2, double arg3) func_impl(int arg1, bool arg2, double arg3)
{ {
using namespace std;
return abs (static_cast<int>((arg2 ? arg1 : 2 * arg1) * arg3)); return abs (static_cast<int>((arg2 ? arg1 : 2 * arg1) * arg3));
} }
int test_main(int, char*[]) int test_main(int, char*[])
{ {
using boost::function;
using namespace boost::lambda;
function <unsigned(bool, double)> f1 = bind(func_impl, 15, _1, _2); function <unsigned(bool, double)> f1 = bind(func_impl, 15, _1, _2);
function <unsigned(double)> f2 = boost::lambda::bind(f1, false, _1); function <unsigned(double)> f2 = bind(f1, false, _1);
function <unsigned()> f3 = boost::lambda::bind(f2, 4.0); function <unsigned()> f3 = bind(f2, 4.0);
f3(); f3();

View File

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