Compare commits

...

154 Commits

Author SHA1 Message Date
Marshall Clow efc2a862a3 Merge to master for 1.62.0 release 2016-08-17 13:27:42 -07:00
Edward Diener 3b126bdf8c Merge pull request #27 from morinmorin/fix/print_warning
Fix "-Wc++11-extensions" warning on Clang in C++03 mode
2016-07-12 16:43:45 -04:00
morinmorin 869438d60b Fix "-Wc++11-extensions" warning on Clang in C++03 mode 2016-07-02 14:27:29 +09:00
Marshall Clow f023a68f78 Merge branch 'develop' 2015-10-03 09:51:29 -07:00
Marshall Clow bc8b860037 Merge pull request #25 from trel/patch-2
Thanks.
2015-09-14 12:38:44 -07:00
Terrell Russell 7a15566169 fix typo
this time onto develop...
2015-09-14 15:03:50 -04:00
Marshall Clow e1cb5fe91e Merge pull request #24 from boostorg/revert-23-patch-1
Revert "fix typo"
2015-09-14 11:58:29 -07:00
Marshall Clow 9153e25b63 Revert "fix typo" 2015-09-14 11:58:14 -07:00
Marshall Clow 1f463f62ef Merge pull request #23 from trel/patch-1
Thanks.
2015-09-14 11:58:09 -07:00
Terrell Russell daaf813cee fix typo 2015-09-14 14:55:13 -04:00
Marshall Clow 53d9af7e8f Merge pull request #22 from akumta/patch-1
Update for Boost ticket #11594 - @akumta , please watch the test bots and ping me in a week or so to merge to master.
2015-09-02 08:02:02 -07:00
akumta 1f64380f62 Update for Boost ticket #11594 2015-08-27 10:36:15 -07:00
Edward Diener 4d1b6b3dc7 Merge branch 'develop' 2015-07-18 10:39:03 -04:00
Edward Diener b4fe64a73c Merge pull request #21 from Bagira80/additions_to_fix_for_issue11224
Addition to fix / workaround for issue #11224.
2015-05-20 02:33:21 -04:00
Deniz Bahadir 7c9701ee5c Addition to fix / workaround for issue #11224.
* Added default-value for cmdline-option which expects the Boost
  source-directory. It points to the Boost source-directory in which the
  script "boost_mpl_preprocess.py" is located.
* Adjusted "README.txt" file to reflect these changes.

Signed-off-by: Deniz Bahadir <dbahadir@benocs.com>
2015-05-19 12:11:44 +02:00
Edward Diener dd5f2d9c03 Merge pull request #20 from Bagira80/develop
Fix for issue 11224 ("Pre-processing / Pre-generating MPL-containers stopped working")
2015-05-18 10:42:49 -04:00
Deniz Bahadir 0e262c22a0 Fix / Workaround for issue #11224. (cont.)
* Extended script "boost_mpl_preprocess.py" to automatically call script
  "fix_boost_mpl_preprocess.py" prior to pre-processing and thereby
  automatically fix issue #11224.
* Extended script "fix_boost_mpl_preprocess.py" to just allow checking
  if the selected Boost source-directory requires fixing because of
  issue #11224.
* Adjusted the "README.txt" accordingly.

Signed-off-by: Deniz Bahadir <dbahadir@benocs.com>
2015-05-01 18:07:59 +02:00
Deniz Bahadir 7cd0559ce8 Fix / Workaround for issue #11224. (cont.)
* Corrected a small error in a regex of "boost_mpl_preprocess.py" which
  did match too much and therefore resulted in wrong substitution in
  some cases.
* Added some more directories with files that need fixing to script
  "fix_boost_mpl_preprocess.py".

Signed-off-by: Deniz Bahadir <dbahadir@benocs.com>
2015-05-01 17:57:34 +02:00
Edward Diener 10e7609c67 Merge pull request #16 from brunocodutra/Tickets7975_8749
Fix to Tickets #7975 and #8749 - Branched off from develop. Please check regression tests to mak sure there are no problems caused by this fix.
2015-04-28 16:28:32 -04:00
Edward Diener 133a980224 Merge pull request #14 from brunocodutra/Ticket11001
Fix to Ticket #11001
2015-04-28 16:06:42 -04:00
Deniz Bahadir 95f79d95a5 Fix / Workaround for issue #11224.
Python-script "fix_boost_mpl_preprocess.py" fixes the header-problems
described in issue #11224.
Python-script "boost_mpl_preprocess.py" simplifies the pre-processing of
MPL-containers.

Signed-off-by: Deniz Bahadir <dbahadir@benocs.com>
2015-04-22 13:47:06 +02:00
Deniz Bahadir d5dcd7abb1 Removed references to non-supported compilers.
Signed-off-by: Deniz Bahadir <dbahadir@benocs.com>
2015-04-21 15:40:24 +02:00
Edward Diener 2531010a0a Added include for integral constant. 2015-04-02 08:00:13 -04:00
Edward Diener 90951ea9e4 Remove reliance on deprecated type_traits headers. Fixed apply test. 2015-04-02 07:54:36 -04:00
Marshall Clow 8a8b7b134e Merge changes from develop 2015-03-30 10:09:26 -07:00
Edward Diener 82e81345f2 Merge pull request #19 from brunocodutra/Ticket7769
Fix to pull request #13
2015-03-22 14:25:07 -04:00
Bruno Dutra 0f5451623c adding tests to attest other views don't suffer of it either 2015-03-21 22:19:56 -03:00
Bruno Dutra eaa3f26c9c fixing the issue for empty_sequence's as well 2015-03-21 22:04:52 -03:00
Bruno Dutra 07a5457dcd avoiding errors on visual studio compilers
errors were due to the way MPL_ASSERT is defined for these compilers
2015-03-21 21:08:05 -03:00
Marshall Clow f0f1680f3c Merge pull request #18 from felgru/develop
fix typos in the documentation; pull request from @felgru
2015-03-20 16:19:21 -07:00
Felix Gruber 2be4714cc5 fix typos in the documentation 2015-03-20 22:42:27 +01:00
Marshall Clow 952471841f Merge pull request #13 from brunocodutra/Ticket7769
Fix to Ticket #7769 - @brunocodutra, please watch the test runners, and ping me in a few days. I will merge to master then. Thanks!
2015-03-19 10:26:39 -07:00
Bruno Dutra c8fe35643d Fix to Tickets #7975 and #8749
Originally Tickets 7975 and 8749 referred only to insertion of keys into
maps, but the very same bug can be reproduced for sets as well.
Moreover, the removal of keys from both also suffers of the same bug.
2015-02-22 20:59:59 -03:00
Bruno Dutra feb7835e62 Adding newly added test to the Jamfile 2015-02-21 23:19:03 -03:00
Bruno Dutra faf17ec858 Adding test cases for a scenario of increased arity limit
Test cases are based on calling apply to forward to the and_ predicate
an increasing number, from 2 to 15, of true_ constants. Since the arity
limit on the current version is set to 5,
BOOST_MPL_LIMIT_METAFUNCTION_ARITY and
BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS must be appropriately set.
2015-02-21 23:15:38 -03:00
Bruno Dutra 77cda02d85 Adding a new test case for insert_range.
Tests whether insert_range works with set, set_c and map as it should.
2015-02-21 19:44:20 -02:00
Bruno Dutra f807edab2e Specializing insert_range for aux::set_tag as well
Follows the same rationale as for maps.
2015-02-21 19:42:38 -02:00
Bruno Dutra fc18efc259 Specializing insert_range for aux::map_tag
Taking advantage of the fact that order of insertion doesn't really
matter for associative sequences.
Comparing to the default implementation, which at any rate does work for
associative sequences, this specialization essencially avoids
reinserting every element of Sequence into a new sequence, besides the
fact no joint_view nor iterator_range needs to be instantiated.
2015-02-10 20:59:54 -02:00
Bruno Dutra c7798600d6 Inserting elements at the beginning of Sequence, rather than at the end
This way we take advantage of the constant-time insertion and removal of
elements at the beginning of Front Extensible sequences, such as list.
This implementation is closer to the original.
2015-02-09 20:48:55 -02:00
Bruno Dutra 1c02715e49 Fix to bug 11001
According to reference, insert_range should work for any Extensible
sequence or Extensible Associative sequence, but the default
implementation of insert_range_impl assumes a front_inserter is defined
for the given sequence, but neither Extensible nor every Extensible
Associative sequences are required to also be a Front Extensible
sequence. This fix rely only on insert, which is defined for every
Extensible sequence.
2015-02-09 00:04:07 -02:00
Bruno Dutra 6fd793c787 keeping it simple 2015-02-08 19:14:55 -02:00
Bruno Dutra ff4944f0ec using BOOST_PP_ENUM_PARAMS to generate base seq accordingly
hardcoding a base seq from 0 to 9 was the culprit behind Ticket #7769
2015-02-08 17:07:22 -02:00
K. Noel Belcourt 6a0f617a6c Revert "Merge pull request #11 from Lastique/modularization"
This reverts commit a9a1eddba8, reversing
changes made to d6bc9845ba.
2014-09-19 18:55:00 -06:00
K. Noel Belcourt a30e4a49a8 Revert "Merge pull request #12 from Lastique/modularization_fix"
This reverts commit c296697981, reversing
changes made to a9a1eddba8.
2014-09-19 18:54:50 -06:00
Edward Diener c296697981 Merge pull request #12 from Lastique/modularization_fix
Move compiler.hpp to MPL.Core to avoid circular dependency.
2014-09-17 19:31:37 -04:00
Andrey Semashev c7997e039d Moved compiler.hpp to MPL.Core to avoid circular dependency. 2014-09-16 15:43:08 +04:00
Noel Belcourt a9a1eddba8 Merge pull request #11 from Lastique/modularization
Separate MPL and MPL.Core

Unfortunately, I'm not able to test it right now.
2014-09-10 14:36:48 -06:00
Andrey Semashev cddc55a6c4 Updated tests and jamfiles to reflect the changed testing headers location. 2014-09-04 23:39:44 +04:00
Andrey Semashev 332389f50e Moved testing headers to tests to avoid dependency on Boost.Core. 2014-09-04 23:15:04 +04:00
Andrey Semashev 6064a97e3a Moved sizeof.hpp to core components. 2014-08-31 14:41:53 +04:00
Andrey Semashev a46a787a49 Use core/lightweight_test.hpp. 2014-08-31 14:11:17 +04:00
Andrey Semashev 9bbc806090 Fixed tests compilation. 2014-08-31 14:09:10 +04:00
Andrey Semashev 64f50f82aa Removed workaround for Borland Compiler 5.9 to avoid dependency on TypeTraits. 2014-08-30 21:00:05 +04:00
Andrey Semashev 6b37526352 Added a readme file. 2014-08-30 20:48:46 +04:00
Andrey Semashev b2d6e667a0 Added a sublibs tag file. 2014-08-30 20:42:30 +04:00
Andrey Semashev a469a67ab8 Removed dependency on TypeTraits. 2014-08-30 20:39:07 +04:00
Andrey Semashev e296279084 Moved min/max to MPL.Core. 2014-08-30 20:26:01 +04:00
Andrey Semashev 07bff9e105 Moved tests for core components to the sub-library. 2014-08-30 20:15:54 +04:00
Andrey Semashev 82890fd03e Moved Boost.MPL.Core headers to a sublibrary. 2014-08-30 17:21:16 +04:00
Edward Diener d6bc9845ba Merge pull request #10 from danieljames/metadata
Create metadata file.
2014-08-18 11:38:29 -04:00
Daniel James afe0e6bbc4 Add metadata file. 2014-08-18 15:07:32 +01:00
Eric Niebler 0341108f6b add back the has_xxx workaround for msvc if used with nvcc 2014-07-09 17:12:31 -04:00
Eric Niebler 2b6fba6f6c eliminate unnecessary workaround for modern msvc versions 2014-07-09 17:11:36 -04:00
Edward Diener bde91646cf Merge pull request #9 from ericniebler/develop
add back the has_xxx workaround for msvc if used with nvcc
2014-07-07 19:36:08 -04:00
Eric Niebler aec459a49c add back the has_xxx workaround for msvc if used with nvcc 2014-07-07 15:47:06 -07:00
Edward Diener 1169c26856 Merge pull request #8 from ericniebler/has-xxx-msvc
eliminate unnecessary workaround for modern msvc versions
2014-06-27 07:42:17 -04:00
Eric Niebler 6893e5e5de eliminate unnecessary workaround for modern msvc versions 2014-06-26 22:25:53 -07:00
Peter Dimov e6bca9d8fc Merge branch 'develop' 2014-06-05 00:25:39 +03:00
Peter Dimov 0b6167c840 Remove dependency on Detail by using Predef directly. 2014-06-05 00:23:41 +03:00
Paul f976861e13 Add test for constexpr conversion operator 2014-05-16 07:49:35 -06:00
Paul ed58434c88 Add constexpr to conversion operator for bool integral constants 2014-05-16 07:49:35 -06:00
Paul 1f482c4fa1 Add constexpr to conversion operator for integral constants 2014-05-16 07:49:34 -06:00
Noel Belcourt d032c78c1d Merge pull request #6 from boostorg/develop
Merge to master
2014-05-08 20:24:29 -06:00
Noel Belcourt e5e30a45a4 Merge pull request #5 from ericniebler/develop
mpl::for_each works on nvidia gpu's

Nice, thanks.
2014-05-01 19:38:00 -06:00
Eric Niebler 7f823bec1c mpl::for_each works on nvidia gpu's 2014-05-01 15:38:13 -07:00
Marshall Clow cafafafea3 Merge pull request #4 from robertramey/develop
added mol print functionally for Clang compiler
2014-03-26 19:10:36 -07:00
Robert Ramey de26efa6ea added mol print functionally for Clang compiler 2014-03-26 12:41:20 -07:00
Daniel James 04d02649d8 Merge branch 'develop'
No-op since develop and master are now the same - will make it easier to
merge future changes.
2014-03-25 08:34:40 +00:00
Daniel James db7e720ce1 Revert Stephen Kelly's changes.
They should really wait until MPL's dependencies have dealt with his
changes.
2014-03-25 08:33:44 +00:00
Edward Diener 51b8f0e100 Cast to long for c++11.
[SVN r86693]
2014-03-23 15:52:52 -04:00
Edward Diener 77651e4aa1 In clang using VC++ RTL the VC++ macros are keywords.
[SVN r86682]
2014-03-23 15:52:24 -04:00
Daniel James 0be4fc4b34 Merge whitespace fix. 2014-03-20 23:01:00 +00:00
Daniel James 858652cd0d Create merge base for develop.
From cherry-picking changes into develop.
2014-03-20 22:58:58 +00:00
Daniel James 8a2e64723c Merge cherry-picked changes from develop. 2014-03-20 22:57:52 +00:00
Daniel James 27815b8d37 Merge pull request #2 from danieljames/develop-cherry-pick
Cherry pick old changes from master, and a small whitespace fix.
2014-03-20 22:53:28 +00:00
Daniel James ea6c446ad6 Fix whitespace in 'test/always.cpp'. 2014-03-17 11:38:13 +00:00
Aleksey Gurtovoy bf895af8f7 Docs/cosmetic: fix td/th border style in Firefox
[SVN r69117]
2014-03-02 23:42:31 +00:00
Aleksey Gurtovoy d1a05aed0a Closing ticket #816
[SVN r69116]
2014-03-02 23:42:31 +00:00
Joel Falcou 2d3c8f076d Applied an adapted version of patch from Ticket #4364
[SVN r72020]
2014-03-02 23:40:28 +00:00
Joel Falcou 94154603ec mpl::always is now nullary. Test is updated to take care of new possible calls using apply and apply0.
[SVN r71163]
2014-03-02 23:40:10 +00:00
Joel Falcou 74fef329d4 Applied documentation patch from Daniel James. Fix Ticket #5240
[SVN r71159]
2014-03-02 23:39:50 +00:00
Joel Falcou 3bf644fc10 Fully qualified mpl::for_each call to prevent conflict with phoenix::for_each on
some compiler.

[SVN r69601]
2014-03-02 23:39:33 +00:00
Steven Watanabe 8886e3d7da Fix name in list example. Fixes #4875.
[SVN r67105]
2014-03-02 23:39:14 +00:00
Steven Watanabe e174e49e32 Fix set_c iterators.
[SVN r65166]
2014-03-02 23:38:55 +00:00
Neil Groves 11b9928353 Improve compatibility with compilers other than GCC.
[SVN r61922]
2014-03-02 23:38:35 +00:00
Aleksey Gurtovoy 4cee88eae9 MPL refmanual: for_each doc fixes (thanks to Emil Dotchevski)
[SVN r55858]
2014-03-02 23:38:13 +00:00
Aleksey Gurtovoy acdd0e5a92 dummy file
[SVN r11268]
2014-03-02 23:37:55 +00:00
Edward Diener ec73776cbd Cast to long for c++11.
[SVN r86693]
2013-11-14 04:43:57 +00:00
Edward Diener cccddd65c7 In clang using VC++ RTL the VC++ macros are keywords.
[SVN r86682]
2013-11-13 17:38:31 +00:00
Beman Dawes 3e3b4aeef2 Merge 84443 from trunk, to fix mpl assert failures for msvc in many libraries.
[SVN r86514]
2013-10-29 13:15:03 +00:00
Stephen Kelly 2c77a2b9c1 Fix mpl on MSVC.
MSVC defines this macro to 0.

[SVN r86263]
2013-10-12 13:07:26 +00:00
Stephen Kelly c77da6a6da MPL: Limit a GCC workaround to a version tested to not need it.
[SVN r86261]
2013-10-12 10:32:40 +00:00
Stephen Kelly eccea8a324 MPL: Remove obsolete GCC version checks.
[SVN r86260]
2013-10-12 10:19:11 +00:00
Stephen Kelly 553aa2e52f Remove remaining occurances of BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
These evaded scripting.

[SVN r86249]
2013-10-11 23:22:36 +00:00
Stephen Kelly f580ae3b0a Simplify multi-component ifdefs containing BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
[SVN r86248]
2013-10-11 23:20:59 +00:00
Stephen Kelly b519e4b12b Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #elif...#else...#endif blocks.

[SVN r86247]
2013-10-11 23:19:44 +00:00
Stephen Kelly d6d7e5abe0 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#else...#endif blocks.

[SVN r86245]
2013-10-11 23:17:48 +00:00
Stephen Kelly 2a61f750a9 Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifndef...#endif conditions.

[SVN r86244]
2013-10-11 23:15:00 +00:00
Stephen Kelly 9b42f0453e Remove BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
Process #ifdef...#endif blocks.

[SVN r86243]
2013-10-11 23:13:10 +00:00
Stephen Kelly 61d75128b4 Remove obsolete files.
[SVN r86242]
2013-10-11 23:11:35 +00:00
Stephen Kelly d2fcd238d6 MPL: Remove obsolete GCC version checks.
[SVN r86070]
2013-09-30 15:59:23 +00:00
Stephen Kelly 27b31c31be MPL: Remove nntp_decl.hpp and obsolete includes.
[SVN r85961]
2013-09-26 14:10:37 +00:00
Stephen Kelly 8143a00562 MPL: Remove use of obsolete macro.
[SVN r85958]
2013-09-26 13:07:02 +00:00
Stephen Kelly 18d0db5b5c MPL: Remove use of obsolete macro.
[SVN r85957]
2013-09-26 13:06:05 +00:00
Stephen Kelly 76dab04fa9 MPL: Remove obsolete MSVC version checks.
[SVN r85956]
2013-09-26 13:05:50 +00:00
Stephen Kelly 50865751ae MPL: Remove workaround for no-longer-supported MSVC
[SVN r85948]
2013-09-26 09:47:38 +00:00
Stephen Kelly 83d7bb938f MPL: Remove apply-wrap workaround for no-longer-supported MSVC
[SVN r85947]
2013-09-26 09:47:19 +00:00
Stephen Kelly 310ab7a6ce MPL: Remove use of obsolete macro.
[SVN r85946]
2013-09-26 09:47:03 +00:00
Stephen Kelly 403aea61fe MPL: Remove MSVC 6 and 7 early template instantiation workaround.
[SVN r85945]
2013-09-26 09:46:46 +00:00
Stephen Kelly 3b026baefe MPL: Remove obsolete MSVC version checks.
[SVN r85944]
2013-09-26 09:45:59 +00:00
Stephen Kelly 76a5c4cf54 MPL: Remove obsolete files for old MSVC compilers.
[SVN r85943]
2013-09-26 09:45:41 +00:00
Stephen Kelly cefaca1789 MPL: Bump the MSVC compiler requirements
[SVN r85942]
2013-09-26 09:44:29 +00:00
Stephen Kelly de207e3775 MPL: Remove assert workaround for no-longer-supported MSVC.
[SVN r85892]
2013-09-25 10:28:10 +00:00
Stephen Kelly 8951fa2a3b MPL: Remove MSVC workaround for void templates.
[SVN r85891]
2013-09-25 10:27:56 +00:00
Stephen Kelly 67f5d73999 MPL: Remove use of obsolete BOOST_MPL_CFG_NO_APPLY_TEMPLATE
It was only defined for MSVC versions which are no longer supported.

[SVN r85887]
2013-09-25 08:26:46 +00:00
Stephen Kelly 50f26179f6 MPL: Remove use of obsolete BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION
[SVN r85886]
2013-09-25 08:26:31 +00:00
Stephen Kelly 0e065bc65a MPL: Remove use of obsolete BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS
This macro is no longer defined for any compiler.

[SVN r85885]
2013-09-25 08:26:10 +00:00
Steven Watanabe d6c3a16e1e Make BOOST_WORKAROUND consistent.
[SVN r84443]
2013-05-23 14:42:25 +00:00
Steven Watanabe 6e78a8f0f4 Merge [81027] from the trunk.
[SVN r84442]
2013-05-23 14:38:22 +00:00
Steven Watanabe aa8e43a017 Work around VC11 bug when evaluating nested BOOST_MPL_ASSERTs.
[SVN r81027]
2012-10-20 16:43:51 +00:00
Joel Falcou 7d2a04eea3 Applied an adapted version of patch from Ticket #4364
[SVN r72020]
2011-05-17 18:16:59 +00:00
Joel Falcou f8e9b04e6a mpl::always is now nullary. Test is updated to take care of new possible calls using apply and apply0.
[SVN r71163]
2011-04-10 11:27:54 +00:00
Joel Falcou de377710d4 Applied documentation patch from Daniel James. Fix Ticket #5240
[SVN r71159]
2011-04-10 07:07:01 +00:00
Joel Falcou fc13a7ac60 Fully qualified mpl::for_each call to prevent conflict with phoenix::for_each on
some compiler.



[SVN r69601]
2011-03-06 11:09:13 +00:00
Aleksey Gurtovoy 161b05edfb Docs/cosmetic: fix td/th border style in Firefox
[SVN r69117]
2011-02-21 10:00:08 +00:00
Aleksey Gurtovoy 3a4c350910 Closing ticket #816
[SVN r69116]
2011-02-21 09:41:45 +00:00
Steven Watanabe 7cd1d88886 Fix name in list example. Fixes #4875.
[SVN r67105]
2010-12-08 17:21:32 +00:00
Steven Watanabe 08c6156599 Fix for_each test for C++0x
[SVN r65167]
2010-09-01 16:08:21 +00:00
Steven Watanabe 2a2c4d2895 Fix set_c iterators.
[SVN r65166]
2010-09-01 15:16:53 +00:00
Steven Watanabe 6f63e9d0c6 Update generated html docs for MPL.
[SVN r64705]
2010-08-09 20:07:24 +00:00
Daniel Walker 45d0bcadc2 fixed missing header dependency
[SVN r64144]
2010-07-18 23:59:27 +00:00
Daniel Walker ff2df79e35 removed arity detection from has_xxx_template
[SVN r63726]
2010-07-07 20:44:59 +00:00
Eric Niebler a5ba971297 make mpl::string work with mpl::transform
[SVN r63024]
2010-06-16 17:57:41 +00:00
Steven Watanabe 360322e894 Add BOOST_MPL_HAS_XXX_TEMPLATE_DEF. Fixes #861
[SVN r62579]
2010-06-08 14:24:55 +00:00
Neil Groves 52d8442055 Improve compatibility with compilers other than GCC.
[SVN r61922]
2010-05-11 22:20:19 +00:00
Neil Groves b6e98cdd5a Fixed defect that showed up with Visual C++ 10. This has been affecting numerous libraries as a knock-on effect.
[SVN r61916]
2010-05-11 18:30:04 +00:00
Hartmut Kaiser cc82b7a924 MPL: fixed #4061: gcc-4.5 compilation problems related to arity_helper, applied attached patch to the main aux_/template_arity.hpp and regenerated the corresponding file preprocessed/gcc/template_arity.hpp. No other preprocessed files are affected.
This patch seemed to be fine as all it does is to qualify an internal name in order to avoid it being looked up through ADL. This appears to be reasonably safe as this name is internal and not supposed to be found using ADL in the first place.


[SVN r61467]
2010-04-21 17:19:06 +00:00
Aleksey Gurtovoy 4678423fee Fix for #1992
[SVN r60888]
2010-03-28 14:23:38 +00:00
Aleksey Gurtovoy 38e0d6157f Fix bitand/bitor conflicts with iso64.h header
[SVN r59248]
2010-01-24 05:45:36 +00:00
Aleksey Gurtovoy 9e7f06d29b Fix bogus protect example
[SVN r58111]
2009-12-03 10:44:05 +00:00
Troy D. Straszheim ae88433250 rm cmake from trunk. I'm not entirely sure this is necessary to satisfy the inspect script, but I'm not taking any chances, and it is easy to put back
[SVN r56942]
2009-10-17 02:07:38 +00:00
Aleksey Gurtovoy b74cf94d04 MPL refmanual: for_each doc fixes (thanks to Emil Dotchevski)
[SVN r55858]
2009-08-29 08:48:11 +00:00
Steven Watanabe d38f271fae Use order instead of size to find the next order in the non-typeof implementation of mpl::insert for mpl::map. Fixes #2042.
[SVN r55727]
2009-08-23 04:42:25 +00:00
Steven Watanabe c1de64359f Provide definitions for the dummy structs used by has_push_back_impl and has_push_front_impl so that they work with Fusion containers. Fixes #3337.
[SVN r55672]
2009-08-19 22:52:27 +00:00
65 changed files with 1079 additions and 148 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ metafunctions. It provides a conceptual foundation and an extensive
set of powerful and coherent tools that make doing explict metaprogramming
in C++ as easy and enjoyable as possible within the current language.</p>
<p>There are several places to start when getting familiar with the library,
depending on what your know about metaprogramming in general and
depending on what you know about metaprogramming in general and
C++ template metaprogramming in particular. Starting with
Boost version 1.32, the MPL comes with both an <a class="reference" href="./tutorial/tutorial-metafunctions.html">in-depth tutorial</a> on its
fundamental concepts and an annotated <a class="reference" href="./tutorial/reference-manual.html">reference manual</a> covering all concepts
+2 -2
View File
@@ -123,7 +123,7 @@ typedef <a href="./next.html" class="identifier">next</a>&lt;i<sub>n</sub>&gt;::
</tr>
<tr class="field"><th class="field-name">Postcondition:</th><td class="field-body"><p class="first">Equivalent to</p>
<pre class="last literal-block">
<a href="./for-each.html" class="identifier">for_each</a>&lt; tranform_view&lt;s,op&gt; &gt;( f );
<a href="./for-each.html" class="identifier">for_each</a>&lt; <a href="./transform-view.html" class="identifier">transform_view</a>&lt;s,op&gt; &gt;( f );
</pre>
</td>
</tr>
@@ -141,7 +141,7 @@ struct value_printer
{
template&lt; typename U &gt; void operator()(U x)
{
std::cout &lt;&lt; x &lt;&lt; 'n';
std::cout &lt;&lt; x &lt;&lt; '\n';
}
};
+1 -1
View File
@@ -142,7 +142,7 @@ of <tt class="literal"><span class="pre">l</span></tt> in the same order; see
<h3><a class="subsection-title" href="#example" name="example">Example</a></h3>
<pre class="literal-block">
typedef <a href="./list.html" class="identifier">list</a>&lt;float,double,long double&gt; floats;
typedef <a href="./push-front.html" class="identifier">push_front</a>&lt;floating_types,int&gt;::type types;
typedef <a href="./push-front.html" class="identifier">push_front</a>&lt;floats,int&gt;::type types;
<a href="./assert.html" class="identifier">BOOST_MPL_ASSERT</a>(( is_same&lt; <a href="./front.html" class="identifier">front</a>&lt;types&gt;::type, int > ));
</pre>
+17 -5
View File
@@ -12,7 +12,7 @@
<td class="header-group page-location"><a href="../refmanual.html" class="navigation-link">Front Page</a> / <a href="./sequences.html" class="navigation-link">Sequences</a> / <a href="./classes.html" class="navigation-link">Classes</a> / <a href="./set.html" class="navigation-link">set</a></td>
</tr></table><div class="header-separator"></div>
<div class="section" id="set">
<h1><a class="toc-backref" href="./classes.html#id1409">set</a></h1>
<h1><a class="toc-backref" href="./classes.html#id1410">set</a></h1>
<div class="section" id="id72">
<h3><a class="subsection-title" href="#description" name="description">Description</a></h3>
<p><tt class="literal"><span class="pre"><a href="./set.html" class="identifier">set</a></span></tt> is a <a class="reference internal" href="./variadic-sequence.html">variadic</a>, <a class="reference internal" href="./associative-sequence.html">associative</a>, <a class="reference internal" href="./extensible-associative-sequence.html">extensible</a> sequence of types that
@@ -52,7 +52,8 @@ A <tt class="literal"><span class="pre"><a href="./set.html" class="identifier">
<div class="section" id="id77">
<h3><a class="subsection-title" href="#expression-semantics" name="expression-semantics">Expression semantics</a></h3>
<p>In the following table, <tt class="literal"><span class="pre">s</span></tt> is an instance of <tt class="literal"><span class="pre"><a href="./set.html" class="identifier">set</a></span></tt>, <tt class="literal"><span class="pre">pos</span></tt> is an iterator into <tt class="literal"><span class="pre">s</span></tt>,
and <tt class="literal"><span class="pre">x</span></tt>, <tt class="literal"><span class="pre">k</span></tt>, and <em>t</em><sub>1</sub>,<em>t</em><sub>2</sub>,... <em>t</em><sub>n</sub> are arbitrary types.</p>
and <tt class="literal"><span class="pre">x</span></tt>, <tt class="literal"><span class="pre">k</span></tt>, and <em>t</em><sub>1</sub>,<em>t</em><sub>2</sub>,... <em>t</em><sub>n</sub> is a set of <em>unique</em> arbitrary types. [<em>Note:</em> See <a class="reference internal" href="./set.html#nonunique-set-example">below</a> for
an example of how to construct a <tt class="literal"><span class="pre"><a href="./set.html" class="identifier">set</a></span></tt> from a list of potentially non-unique types — <em>end note</em>]</p>
<table border="1" class="docutils table">
<colgroup>
<col width="40%" />
@@ -151,8 +152,9 @@ the key <tt class="literal"><span class="pre">k</span></tt> in <tt class="litera
</tbody>
</table>
</div>
<div class="section" id="id78">
<div class="section" id="id79">
<h3><a class="subsection-title" href="#example" name="example">Example</a></h3>
<p>Basic <tt class="literal"><span class="pre"><a href="./set.html" class="identifier">set</a></span></tt> invariants:</p>
<pre class="literal-block">
typedef <a href="./set.html" class="identifier">set</a>&lt; int,long,double,<a href="./int.html" class="identifier">int_</a>&lt;5&gt; &gt; s;
@@ -164,8 +166,18 @@ typedef <a href="./set.html" class="identifier">set</a>&lt; int,long,double,<a h
<a href="./assert.html" class="identifier">BOOST_MPL_ASSERT</a>(( is_same&lt; <a href="./at.html" class="identifier">at</a>&lt;s,<a href="./int.html" class="identifier">int_</a>&lt;5&gt; &gt;::type, <a href="./int.html" class="identifier">int_</a>&lt;5&gt; &gt; ));
<a href="./assert.html" class="identifier">BOOST_MPL_ASSERT</a>(( is_same&lt; <a href="./at.html" class="identifier">at</a>&lt;s,char&gt;::type, <a href="./void.html" class="identifier">void_</a> > ));
</pre>
<p id="nonunique-set-example">Constructing a <tt class="literal"><span class="pre"><a href="./set.html" class="identifier">set</a></span></tt> from a list of potentially non-unique types:</p>
<pre class="literal-block">
typedef <a href="./fold.html" class="identifier">fold</a>&lt;
<a href="./vector.html" class="identifier">vector</a>&lt;int,int,long,long&gt;
, set0&lt;&gt;
, <a href="./insert.html" class="identifier">insert</a>&lt;<a href="./placeholders.html" class="identifier">_1</a>,<a href="./placeholders.html" class="identifier">_2</a>&gt;
&gt;::type s;
<a href="./assert-relation.html" class="identifier">BOOST_MPL_ASSERT_RELATION</a>( <a href="./size.html" class="identifier">size</a>&lt;s&gt;::value, ==, 2 );
</pre>
</div>
<div class="section" id="id79">
<div class="section" id="id80">
<h3><a class="subsection-title" href="#see-also" name="see-also">See also</a></h3>
<p><a class="reference internal" href="./sequences.html">Sequences</a>, <a class="reference internal" href="./variadic-sequence.html">Variadic Sequence</a>, <a class="reference internal" href="./associative-sequence.html">Associative Sequence</a>, <a class="reference internal" href="./extensible-associative-sequence.html">Extensible Associative Sequence</a>, <a class="reference internal" href="./set-c.html">set_c</a>, <a class="reference internal" href="./map.html">map</a>, <a class="reference internal" href="./vector.html">vector</a></p>
<!-- Sequences/Classes//map |50 -->
@@ -174,7 +186,7 @@ typedef <a href="./set.html" class="identifier">set</a>&lt; int,long,double,<a h
<div class="footer-separator"></div>
<table class="footer"><tr class="footer"><td class="header-group navigation-bar"><span class="navigation-group"><a href="./deque.html" class="navigation-link">Prev</a>&nbsp;<a href="./map.html" class="navigation-link">Next</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./deque.html" class="navigation-link">Back</a>&nbsp;<a href="./map.html" class="navigation-link">Along</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./classes.html" class="navigation-link">Up</a>&nbsp;<a href="../refmanual.html" class="navigation-link">Home</a></span><span class="navigation-group-separator">&nbsp;|&nbsp;</span><span class="navigation-group"><a href="./refmanual_toc.html" class="navigation-link">Full TOC</a></span></td>
<td><div class="copyright-footer"><div class="copyright">Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams</div>
<td><div class="copyright-footer"><div class="copyright">Copyright © 2001-2011 Aleksey Gurtovoy and David Abrahams</div>
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at <a class="reference external" href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)</div></td></tr></table></body>
</html>
+2 -2
View File
@@ -5,7 +5,7 @@ it possible to decouple `algorithms`__ from concrete compile-time `sequence
implementations`__. Under the hood, all MPL sequence algorithms are
implemented in terms of iterators. In particular, that means that they
will work on any custom compile-time sequence, given that the appropriate
iterator inteface is provided.
iterator interface is provided.
__ `Algorithms`_
__ `label-Sequences-Classes`_
@@ -14,6 +14,6 @@ __ `label-Sequences-Classes`_
.. More?
.. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
.. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+1 -1
View File
@@ -102,7 +102,7 @@ Example
.. parsed-literal::
typedef list<float,double,long double> floats;
typedef push_front<floating_types,int>::type types;
typedef push_front<floats,int>::type types;
BOOST_MPL_ASSERT(( is_same< front<types>::type, int > ));
+22 -2
View File
@@ -37,7 +37,10 @@ Expression semantics
--------------------
In the following table, ``s`` is an instance of ``set``, ``pos`` is an iterator into ``s``,
and ``x``, ``k``, and |t1...tn| are arbitrary types.
and ``x``, ``k``, and |t1...tn| is a set of *unique* arbitrary types. [*Note:* See `below`__ for
an example of how to construct a ``set`` from a list of potentially non-unique types |--| *end note*\]
__ nonunique-set-example_
+---------------------------------------+-----------------------------------------------------------+
| Expression | Semantics |
@@ -105,6 +108,8 @@ and ``x``, ``k``, and |t1...tn| are arbitrary types.
Example
-------
Basic ``set`` invariants:
.. parsed-literal::
typedef set< int,long,double,int_<5> > s;
@@ -118,12 +123,27 @@ Example
BOOST_MPL_ASSERT(( is_same< at<s,char>::type, void\_ > ));
.. _nonunique-set-example:
Constructing a ``set`` from a list of potentially non-unique types:
.. parsed-literal::
typedef fold<
vector<int,int,long,long>
, set0<>
, insert<_1,_2>
>::type s;
BOOST_MPL_ASSERT_RELATION( size<s>::value, ==, 2 );
See also
--------
|Sequences|, |Variadic Sequence|, |Associative Sequence|, |Extensible Associative Sequence|, |set_c|, |map|, |vector|
.. copyright:: Copyright © 2001-2009 Aleksey Gurtovoy and David Abrahams
.. copyright:: Copyright © 2001-2011 Aleksey Gurtovoy and David Abrahams
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+1
View File
@@ -644,6 +644,7 @@ td,
table.table
th
{
border: solid 1px #c7c7c7;
vertical-align: top;
}
+1 -1
View File
@@ -78,7 +78,7 @@ one.</p>
</ol>
<p>To get a detailed picture of the new apply/lambda semantics, please
see the test case at
<a class="reference" href="http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/mpl/test/apply.cpp?view=markup" target="_top">http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/mpl/test/apply.cpp?view=markup</a>
<a class="reference" href="../../test/apply.cpp" target="_top">libs/mpl/test/apply.cpp</a>
and the corresponding sections of the MPL <a class="reference" href="./reference-manual.html">reference manual</a>.</p>
<table class="footnote" frame="void" id="id21" rules="none">
<colgroup><col class="label" /><col /></colgroup>
+1 -1
View File
@@ -113,7 +113,7 @@ arguments), which comes down to the follwing two criteria:</p>
placeholders do contain these).</li>
</ol>
<p>If these two hold, you can safely put <tt class="literal"><span class="pre">BOOST_MPL_AUX_LAMBDA_SUPPORT</span></tt> inside
your metafunction and forget about the issue. If not, your are out of luck and
your metafunction and forget about the issue. If not, you are out of luck and
probably have to write a metafunction class instead.</p>
<p>The good news are that most of the MPL's own metafunctions and <a class="reference" href="../../../type_traits/index.html" target="_top">Boost.Type Traits</a>
templates are &quot;placeholder-safe&quot; and have the workaround applied to them, so
+1 -1
View File
@@ -24,7 +24,7 @@ arguments of different types, and the result will yield the
largest/most general of the argument types. The infrastructure
allows user-defined numeric types to be freely intermixed with
predefined library types. See
<a class="reference" href="http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/mpl/test/numeric_ops.cpp?view=markup" target="_top">http://cvs.sourceforge.net/viewcvs.py/boost/boost/libs/mpl/test/numeric_ops.cpp?view=markup</a>
<a class="reference" href="../../test/numeric_ops.cpp" target="_top">libs/mpl/test/numeric_ops.cpp</a>
for an illustrative example, and the <a class="reference" href="./reference-manual.html">reference manual</a> for
the formal infrastructure specification.</p>
<p>If you were using MPL numeric metafunctions on your own integral
+1
View File
@@ -0,0 +1 @@
ECHO is on.
+3 -4
View File
@@ -14,7 +14,7 @@
// $Date$
// $Revision$
#include <boost/mpl/aux_/preprocessor/def_params_tail.hpp>
#include <boost/mpl/aux_/preprocessor/default_params.hpp>
#include <boost/mpl/aux_/na.hpp>
#include <boost/mpl/aux_/arity_spec.hpp>
@@ -23,8 +23,7 @@ namespace boost { namespace mpl {
template< typename Value > struct always
{
template<
typename T
BOOST_MPL_PP_NESTED_DEF_PARAMS_TAIL(1, typename T, na)
BOOST_MPL_PP_DEFAULT_PARAMS(BOOST_MPL_LIMIT_METAFUNCTION_ARITY, typename T, na)
>
struct apply
{
@@ -32,7 +31,7 @@ template< typename Value > struct always
};
};
BOOST_MPL_AUX_ARITY_SPEC(1, always)
BOOST_MPL_AUX_ARITY_SPEC(0, always)
}}
+2 -2
View File
@@ -28,7 +28,7 @@
// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(and)'
// has to be checked in a separate condition, otherwise GCC complains
// about 'and' being an alternative token
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(and)
# pragma push_macro("and")
@@ -41,7 +41,7 @@
# define BOOST_MPL_PREPROCESSED_HEADER and.hpp
# include <boost/mpl/aux_/include_preprocessed.hpp>
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(and)
# pragma pop_macro("and")
+71 -2
View File
@@ -25,6 +25,7 @@
#include <boost/mpl/aux_/config/dtp.hpp>
#include <boost/mpl/aux_/config/gcc.hpp>
#include <boost/mpl/aux_/config/msvc.hpp>
#include <boost/mpl/aux_/config/gpu.hpp>
#include <boost/mpl/aux_/config/static_constant.hpp>
#include <boost/mpl/aux_/config/pp_counter.hpp>
#include <boost/mpl/aux_/config/workaround.hpp>
@@ -34,6 +35,9 @@
#include <boost/config.hpp> // make sure 'size_t' is placed into 'std'
#include <cstddef>
#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
#include <boost/mpl/if.hpp>
#endif
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
|| (BOOST_MPL_CFG_GCC != 0) \
@@ -52,7 +56,7 @@
// and GCC (which issues "unused variable" warnings when static constants are used
// at a function scope)
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x610)) \
|| (BOOST_MPL_CFG_GCC != 0)
|| (BOOST_MPL_CFG_GCC != 0) || (BOOST_MPL_CFG_GPU != 0)
# define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) enum { expr }
#else
# define BOOST_MPL_AUX_ASSERT_CONSTANT(T, expr) BOOST_STATIC_CONSTANT(T, expr)
@@ -131,8 +135,38 @@ template< assert_::relations r, long x, long y > struct assert_relation {};
#endif
#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
#if !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
template<class Pred>
struct extract_assert_pred;
template<class Pred>
struct extract_assert_pred<void(Pred)> { typedef Pred type; };
template<class Pred>
struct eval_assert {
typedef typename extract_assert_pred<Pred>::type P;
typedef typename P::type p_type;
typedef typename ::boost::mpl::if_c<p_type::value,
AUX778076_ASSERT_ARG(assert<false>),
failed ************ P::************
>::type type;
};
template<class Pred>
struct eval_assert_not {
typedef typename extract_assert_pred<Pred>::type P;
typedef typename P::type p_type;
typedef typename ::boost::mpl::if_c<!p_type::value,
AUX778076_ASSERT_ARG(assert<false>),
failed ************ ::boost::mpl::not_<P>::************
>::type type;
};
template< typename T >
T make_assert_arg();
#elif !defined(BOOST_MPL_CFG_ASSERT_BROKEN_POINTER_TO_POINTER_TO_MEMBER)
template< bool > struct assert_arg_pred_impl { typedef int type; };
template<> struct assert_arg_pred_impl<true> { typedef void* type; };
@@ -211,6 +245,39 @@ assert_rel_arg( assert_relation<r,x,y> );
BOOST_MPL_AUX_ADL_BARRIER_NAMESPACE_CLOSE
#if BOOST_WORKAROUND(BOOST_MSVC, == 1700)
// BOOST_MPL_ASSERT((pred<x,...>))
#define BOOST_MPL_ASSERT(pred) \
BOOST_MPL_AUX_ASSERT_CONSTANT( \
std::size_t \
, BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
boost::mpl::assertion_failed<false>( \
boost::mpl::make_assert_arg< \
typename boost::mpl::eval_assert<void pred>::type \
>() \
) \
) \
) \
/**/
// BOOST_MPL_ASSERT_NOT((pred<x,...>))
#define BOOST_MPL_ASSERT_NOT(pred) \
BOOST_MPL_AUX_ASSERT_CONSTANT( \
std::size_t \
, BOOST_PP_CAT(mpl_assertion_in_line_,BOOST_MPL_AUX_PP_COUNTER()) = sizeof( \
boost::mpl::assertion_failed<false>( \
boost::mpl::make_assert_arg< \
typename boost::mpl::eval_assert_not<void pred>::type \
>() \
) \
) \
) \
/**/
#else
// BOOST_MPL_ASSERT((pred<x,...>))
@@ -250,6 +317,8 @@ BOOST_MPL_AUX_ASSERT_CONSTANT( \
/**/
#endif
#endif
// BOOST_MPL_ASSERT_RELATION(x, ==|!=|<=|<|>=|>, y)
#if defined(BOOST_MPL_CFG_ASSERT_USE_RELATION_NAMES)
+35
View File
@@ -0,0 +1,35 @@
#ifndef BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
#define BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
// Copyright Eric Niebler 2014
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#include <boost/config.hpp>
#if !defined(BOOST_MPL_CFG_GPU_ENABLED) \
# define BOOST_MPL_CFG_GPU_ENABLED BOOST_GPU_ENABLED
#endif
#if defined __CUDACC__
# define BOOST_MPL_CFG_GPU 1
#else
# define BOOST_MPL_CFG_GPU 0
#endif
#endif // BOOST_MPL_AUX_CONFIG_GPU_HPP_INCLUDED
@@ -24,6 +24,7 @@
|| BOOST_WORKAROUND(__EDG_VERSION__, <= 245) \
|| BOOST_WORKAROUND(BOOST_MPL_CFG_GCC, <= 0x0295) \
|| BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) \
|| BOOST_WORKAROUND(__NVCC__, BOOST_TESTED_AT(1)) \
)
# define BOOST_MPL_CFG_USE_OPERATORS_OVERLOADING
+19 -16
View File
@@ -14,9 +14,10 @@
// $Date$
// $Revision$
#include <boost/mpl/copy.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/insert.hpp>
#include <boost/mpl/clear.hpp>
#include <boost/mpl/front_inserter.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/iterator_range.hpp>
#include <boost/mpl/aux_/na_spec.hpp>
@@ -43,29 +44,31 @@ struct insert_range_impl
>
struct apply
#if !defined(BOOST_MPL_CFG_NO_NESTED_FORWARDING)
: reverse_copy<
joint_view<
: reverse_fold<
joint_view<
iterator_range<typename begin<Sequence>::type,Pos>
, joint_view<
, joint_view<
Range
, iterator_range<Pos,typename end<Sequence>::type>
>
>
, front_inserter< typename clear<Sequence>::type >
, typename clear<Sequence>::type
, insert<_1, begin<_1>, _2>
>
{
#else
{
typedef typename reverse_copy<
joint_view<
iterator_range<typename begin<Sequence>::type,Pos>
, joint_view<
Range
, iterator_range<Pos,typename end<Sequence>::type>
>
>
, front_inserter< typename clear<Sequence>::type >
>::type type;
typedef typename reverse_fold<
joint_view<
iterator_range<typename begin<Sequence>::type,Pos>
, joint_view<
Range
, iterator_range<Pos,typename end<Sequence>::type>
>
>
, typename clear<Sequence>::type
, insert<_1, begin<_1>, _2>
>::type type;
#endif
};
};
+1 -1
View File
@@ -77,7 +77,7 @@ struct AUX_WRAPPER_NAME
// functions that return objects of both arithmetic ('int', 'long',
// 'double', etc.) and wrapped integral types (for an example, see
// "mpl/example/power.cpp")
operator AUX_WRAPPER_VALUE_TYPE() const { return static_cast<AUX_WRAPPER_VALUE_TYPE>(this->value); }
BOOST_CONSTEXPR operator AUX_WRAPPER_VALUE_TYPE() const { return static_cast<AUX_WRAPPER_VALUE_TYPE>(this->value); }
};
#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
@@ -15,9 +15,16 @@
// $Revision$
#include <boost/preprocessor/seq/subseq.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/arithmetic/add.hpp>
#define BOOST_MPL_PP_RANGE_ITEM(z,n,_) (n)
#define BOOST_MPL_PP_RANGE(first, length) \
BOOST_PP_SEQ_SUBSEQ((0)(1)(2)(3)(4)(5)(6)(7)(8)(9), first, length) \
BOOST_PP_SEQ_SUBSEQ( \
BOOST_PP_REPEAT(BOOST_PP_ADD(first,length), BOOST_MPL_PP_RANGE_ITEM, _), \
first, length \
) \
/**/
#endif // BOOST_MPL_AUX_PREPROCESSOR_RANGE_HPP_INCLUDED
+4
View File
@@ -16,10 +16,12 @@
// $Revision$
#include <boost/ref.hpp>
#include <boost/mpl/aux_/config/gpu.hpp>
namespace boost { namespace mpl { namespace aux {
template< typename F >
BOOST_MPL_CFG_GPU_ENABLED
inline
F& unwrap(F& f, long)
{
@@ -27,6 +29,7 @@ F& unwrap(F& f, long)
}
template< typename F >
BOOST_MPL_CFG_GPU_ENABLED
inline
F&
unwrap(reference_wrapper<F>& f, int)
@@ -35,6 +38,7 @@ unwrap(reference_wrapper<F>& f, int)
}
template< typename F >
BOOST_MPL_CFG_GPU_ENABLED
inline
F&
unwrap(reference_wrapper<F> const& f, int)
+2 -2
View File
@@ -19,7 +19,7 @@
// macros, see http://tinyurl.com/ycwdxco; 'defined(bitand)'
// has to be checked in a separate condition, otherwise GCC complains
// about 'bitand' being an alternative token
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(bitand)
# pragma push_macro("bitand")
@@ -34,7 +34,7 @@
#define AUX778076_OP_TOKEN &
#include <boost/mpl/aux_/arithmetic_op.hpp>
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(bitand)
# pragma pop_macro("bitand")
+2 -2
View File
@@ -19,7 +19,7 @@
// macros, see http://tinyurl.com/ycwdxco; 'defined(bitor)'
// has to be checked in a separate condition, otherwise GCC complains
// about 'bitor' being an alternative token
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(bitor)
# pragma push_macro("bitor")
@@ -34,7 +34,7 @@
#define AUX778076_OP_TOKEN |
#include <boost/mpl/aux_/arithmetic_op.hpp>
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(bitor)
# pragma pop_macro("bitor")
+1 -1
View File
@@ -26,7 +26,7 @@ template< bool C_ > struct bool_
typedef integral_c_tag tag;
typedef bool_ type;
typedef bool value_type;
operator bool() const { return this->value; }
BOOST_CONSTEXPR operator bool() const { return this->value; }
};
#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+10 -6
View File
@@ -17,12 +17,11 @@
#include <boost/mpl/bool.hpp>
#include <boost/mpl/aux_/config/msvc.hpp>
#include <boost/mpl/aux_/config/workaround.hpp>
#include <boost/mpl/aux_/lambda_support.hpp>
#include <boost/type_traits/integral_constant.hpp>
#include <boost/type_traits/is_empty.hpp>
// should be always the last #include directive
#include <boost/type_traits/detail/bool_trait_def.hpp>
namespace boost { namespace mpl {
// empty base class, guaranteed to have no members; inheritance from
@@ -51,9 +50,14 @@ struct is_empty_base<empty_base>
}}
namespace boost {
BOOST_TT_AUX_BOOL_TRAIT_SPEC1(is_empty, mpl::empty_base, true)
template<> struct is_empty< mpl::empty_base >
: public ::boost::integral_constant<bool,true>
{
public:
BOOST_MPL_AUX_LAMBDA_SUPPORT_SPEC(1,is_empty,(mpl::empty_base))
};
}
#include <boost/type_traits/detail/bool_trait_undef.hpp>
#endif // BOOST_MPL_EMPTY_BASE_HPP_INCLUDED
+2 -1
View File
@@ -23,7 +23,8 @@ namespace boost { namespace mpl {
struct empty_sequence
{
struct tag;
struct tag;
typedef empty_sequence type;
struct begin { typedef random_access_iterator_tag category; };
typedef begin end;
};
+3 -3
View File
@@ -4,8 +4,8 @@
// Copyright Aleksey Gurtovoy 2000-2004
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
@@ -43,7 +43,7 @@ struct eval_if
BOOST_MPL_AUX_LAMBDA_SUPPORT(3,eval_if,(C,F1,F2))
};
// (almost) copy & paste in order to save one more
// (almost) copy & paste in order to save one more
// recursively nested template instantiation to user
template<
bool C
+8 -1
View File
@@ -22,6 +22,7 @@
#include <boost/mpl/deref.hpp>
#include <boost/mpl/identity.hpp>
#include <boost/mpl/assert.hpp>
#include <boost/mpl/aux_/config/gpu.hpp>
#include <boost/mpl/aux_/unwrap.hpp>
#include <boost/type_traits/is_same.hpp>
@@ -40,6 +41,7 @@ struct for_each_impl
, typename TransformFunc
, typename F
>
BOOST_MPL_CFG_GPU_ENABLED
static void execute(
Iterator*
, LastIterator*
@@ -59,6 +61,7 @@ struct for_each_impl<false>
, typename TransformFunc
, typename F
>
BOOST_MPL_CFG_GPU_ENABLED
static void execute(
Iterator*
, LastIterator*
@@ -89,6 +92,7 @@ template<
, typename TransformOp
, typename F
>
BOOST_MPL_CFG_GPU_ENABLED
inline
void for_each(F f, Sequence* = 0, TransformOp* = 0)
{
@@ -105,10 +109,13 @@ template<
typename Sequence
, typename F
>
BOOST_MPL_CFG_GPU_ENABLED
inline
void for_each(F f, Sequence* = 0)
{
for_each<Sequence, identity<> >(f);
// jfalcou: fully qualifying this call so it doesnt clash with phoenix::for_each
// ons ome compilers -- done on 02/28/2011
boost::mpl::for_each<Sequence, identity<> >(f);
}
}}
+9 -2
View File
@@ -155,10 +155,11 @@ template<> struct trait<T> \
// SFINAE-based implementations below are derived from a USENET newsgroup's
// posting by Rani Sharoni (comp.lang.c++.moderated, 2002-03-17 07:45:09 PST)
# elif BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1400)) \
# elif BOOST_WORKAROUND(BOOST_MSVC, <= 1400) \
|| (BOOST_WORKAROUND(BOOST_MSVC, BOOST_TESTED_AT(1800)) && defined(__CUDACC__)) \
|| BOOST_WORKAROUND(__IBMCPP__, <= 700)
// MSVC 7.1+ & VACPP
// MSVC 7.1 & MSVC 8.0 & VACPP
// agurt, 15/jun/05: replace overload-based SFINAE implementation with SFINAE
// applied to partial specialization to fix some apparently random failures
@@ -290,18 +291,24 @@ struct trait \
# if !defined(BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES)
# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
# define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 1
# else
# define BOOST_MPL_HAS_XXX_NO_WRAPPED_TYPES 0
# endif
# endif
# if !defined(BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION)
# if (defined(BOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS))
# define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 1
# else
# define BOOST_MPL_HAS_XXX_NO_EXPLICIT_TEST_FUNCTION 0
# endif
# endif
# if !defined(BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE)
# if BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
# define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 1
# else
# define BOOST_MPL_HAS_XXX_NEEDS_TEMPLATE_SFINAE 0
# endif
# endif
@@ -0,0 +1,41 @@
#ifndef BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
#define BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
// Copyright Bruno Dutra 2015
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#include <boost/mpl/insert_range_fwd.hpp>
#include <boost/mpl/map/aux_/tag.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/insert.hpp>
namespace boost { namespace mpl {
template<>
struct insert_range_impl< aux::map_tag >
{
template<
typename Sequence
, typename /*Pos*/
, typename Range
>
struct apply
: fold<Range, Sequence, insert<_1, _2> >
{
};
};
}}
#endif // BOOST_MPL_MAP_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+3
View File
@@ -40,6 +40,7 @@ struct m_item
typedef Key key_;
typedef pair<Key,T> item;
typedef Base base;
typedef m_item type;
typedef typename next< typename Base::size >::type size;
typedef typename next< typename Base::order >::type order;
@@ -62,6 +63,7 @@ struct m_mask
{
typedef void_ key_;
typedef Base base;
typedef m_mask type;
typedef typename prior< typename Base::size >::type size;
typedef typename x_order_impl<Base,Key>::type key_order_;
@@ -123,6 +125,7 @@ struct m_mask
{
typedef void_ key_;
typedef Base base;
typedef m_mask type;
typedef typename prior< typename Base::size >::type size;
typedef typename x_order_impl<Base,Key>::type key_order_;
+1
View File
@@ -19,6 +19,7 @@
#include <boost/mpl/map/aux_/at_impl.hpp>
//#include <boost/mpl/map/aux_/O1_size.hpp>
#include <boost/mpl/map/aux_/insert_impl.hpp>
#include <boost/mpl/map/aux_/insert_range_impl.hpp>
#include <boost/mpl/map/aux_/erase_impl.hpp>
#include <boost/mpl/map/aux_/erase_key_impl.hpp>
#include <boost/mpl/map/aux_/has_key_impl.hpp>
+2 -2
View File
@@ -29,7 +29,7 @@
// 'or' and 'and' macros, see http://tinyurl.com/3et69; 'defined(or)'
// has to be checked in a separate condition, otherwise GCC complains
// about 'or' being an alternative token
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(or)
# pragma push_macro("or")
@@ -42,7 +42,7 @@
# define BOOST_MPL_PREPROCESSED_HEADER or.hpp
# include <boost/mpl/aux_/include_preprocessed.hpp>
#if defined(_MSC_VER)
#if defined(_MSC_VER) && !defined(__clang__)
#ifndef __GCCXML__
#if defined(or)
# pragma pop_macro("or")
+7 -3
View File
@@ -37,8 +37,7 @@ namespace aux {
static const unsigned value = 1;
};
#endif
} // namespace aux
} // namespace aux
template <class T>
struct print
@@ -47,7 +46,12 @@ struct print
, aux::print_base
#endif
{
#if defined(BOOST_MSVC)
#if defined(__clang__)
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wc++11-extensions"
const int m_x = 1 / (sizeof(T) - sizeof(T));
# pragma clang diagnostic pop
#elif defined(BOOST_MSVC)
enum { n = sizeof(T) + -1 };
#elif defined(__MWERKS__)
void f(int);
@@ -0,0 +1,41 @@
#ifndef BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
#define BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
// Copyright Bruno Dutra 2015
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#include <boost/mpl/insert_range_fwd.hpp>
#include <boost/mpl/set/aux_/tag.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/insert.hpp>
namespace boost { namespace mpl {
template<>
struct insert_range_impl< aux::set_tag >
{
template<
typename Sequence
, typename /*Pos*/
, typename Range
>
struct apply
: fold<Range, Sequence, insert<_1, _2> >
{
};
};
}}
#endif // BOOST_MPL_SET_AUX_INSERT_RANGE_IMPL_HPP_INCLUDED
+5 -3
View File
@@ -32,7 +32,8 @@ struct s_item
typedef s_item<T,Base> item_;
typedef void_ last_masked_;
typedef T item_type_;
typedef Base base;
typedef typename Base::item_ base;
typedef s_item type;
typedef typename next< typename Base::size >::type size;
typedef typename next< typename Base::order >::type order;
@@ -55,8 +56,9 @@ struct s_mask
typedef s_mask<T,Base> item_;
typedef T last_masked_;
typedef void_ item_type_;
typedef Base base;
typedef typename Base::item_ base;
typedef typename prior< typename Base::size >::type size;
typedef s_mask type;
BOOST_MPL_AUX_SET_OVERLOAD( aux::yes_tag, IS_MASKED, s_mask, aux::type_wrapper<T>* );
};
@@ -69,7 +71,7 @@ struct s_unmask
typedef s_unmask<T,Base> item_;
typedef void_ last_masked_;
typedef T item_type_;
typedef Base base;
typedef typename Base::item_ base;
typedef typename next< typename Base::size >::type size;
BOOST_MPL_AUX_SET_OVERLOAD( aux::no_tag, IS_MASKED, s_unmask, aux::type_wrapper<T>* );
+1
View File
@@ -21,6 +21,7 @@
#include <boost/mpl/set/aux_/size_impl.hpp>
#include <boost/mpl/set/aux_/empty_impl.hpp>
#include <boost/mpl/set/aux_/insert_impl.hpp>
#include <boost/mpl/set/aux_/insert_range_impl.hpp>
#include <boost/mpl/set/aux_/erase_impl.hpp>
#include <boost/mpl/set/aux_/erase_key_impl.hpp>
#include <boost/mpl/set/aux_/has_key_impl.hpp>
+2 -2
View File
@@ -19,7 +19,7 @@
#include <boost/config.hpp>
#include <boost/detail/workaround.hpp>
#include <boost/detail/endian.hpp>
#include <boost/predef/other/endian.h>
#include <boost/mpl/limits/string.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/char.hpp>
@@ -59,7 +59,7 @@ namespace boost { namespace mpl
#define BOOST_MPL_MULTICHAR_LENGTH(c) \
(std::size_t)((c<CHAR_MIN) ? 4 : ((c>0xffffff)+(c>0xffff)+(c>0xff)+1))
#if defined(BOOST_LITTLE_ENDIAN) && defined(__SUNPRO_CC)
#if BOOST_ENDIAN_LITTLE_BYTE && defined(__SUNPRO_CC)
#define BOOST_MPL_MULTICHAR_AT(c,i) \
(char)(0xff&((unsigned)(c)>>(8*(std::size_t)(i))))
+14
View File
@@ -0,0 +1,14 @@
{
"key": "mpl",
"name": "MPL",
"authors": [
"Aleksey Gurtovoy"
],
"description": "The Boost.MPL library is a general-purpose, high-level C++ template metaprogramming framework of compile-time algorithms, sequences and metafunctions. It provides a conceptual foundation and an extensive set of powerful and coherent tools that make doing explict metaprogramming in C++ as easy and enjoyable as possible within the current language.",
"category": [
"Metaprogramming"
],
"maintainers": [
"Aleksey Gurtovoy <agurtovoy -at- meta-comm.com>"
]
}
+70
View File
@@ -0,0 +1,70 @@
Pre-processing of MPL-containers
--------------------------------
Pre-processing of MPL-containers can be accomplished using the script
"boost_mpl_preprocess.py". In the simple case call it with a single
argument which is the path to the source-directory of Boost.
python boost_mpl_preprocess.py <path-to-boost-sourcedir>
If the Boost source-directory is the one this script resides in, you
can just call it without any arguments.
python boost_mpl_preprocess.py
Either way, this will pre-process all four MPL-container types (vector,
list, set, map) and makes them able to hold up to 100 elements. They can
be used either in their 'numbered' or their 'variadic' form.
Additionally, the script also allows more fine-grained pre-processing.
The maximal number of elements an MPL-container type is able to hold can
be different from the one of other MPL-container types and it can also
differ between its 'numbered' and 'variadic' form.
To see all options, call the script like this:
python boost_mpl_preprocess.py --help
Fixing pre-processing of MPL-containers
---------------------------------------
Sadly, pre-processing of MPL-containers might fail, if the source-files
used as input are missing some header-comments required during the pre-
processing step.
However, the script "boost_mpl_preprocess.py" makes sure to patch these
input source-files prior to pre-processing (by implicitly calling script
"fix_boost_mpl_preprocess.py" with the chosen settings). It only patches
the source-files needed for pre-processing the selected MPL-container
types and their selected form ('numbered' or 'variadic').
If calling it with a single (or no) argument (as in the former section)
all input source-files will be patched automatically.
Instead of fixing the input-files implicitly during pre-processing one
can also fix them explicitly by calling "fix_boost_mpl_preprocess.py"
directly.
If you just want to test if any fixing is needed call it like this:
python fix_boost_mpl_preprocess.py --check-only <path-to-boost-sourcedir>
This will tell you if any fixing is needed. In such a case call the script
"fix_boost_mpl_preprocess.py" like this:
python fix_boost_mpl_preprocess.py <path-to-boost-sourcedir>
This will fix the header-comments of all the source-files needed during
pre-processing. Calling "boost_mpl_preprocess.py" afterwards should then
successfully pre-process the MPL-containers (without the need of implicitly
fixing any files again).
Note:
Failure of pre-processing can be checked by examining at least one of the
following directories in which automatically generated files will be put
during pre-processing. If at least one file in these directories (or sub-
directories therein) has a size of zero bytes, fixing is needed.
<path-to-boost-sourcedir>/boost/mpl/vector/aux_/preprocessed/
<path-to-boost-sourcedir>/boost/mpl/list/aux_/preprocessed/
<path-to-boost-sourcedir>/boost/mpl/set/aux_/preprocessed/
<path-to-boost-sourcedir>/boost/mpl/map/aux_/preprocessed/
<path-to-boost-sourcedir>/boost/mpl/aux_/preprocessed/
+244
View File
@@ -0,0 +1,244 @@
# Copyright Deniz Bahadir 2015
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# See http://www.boost.org/libs/mpl for documentation.
# See http://stackoverflow.com/a/20660264/3115457 for further information.
# See http://stackoverflow.com/a/29627158/3115457 for further information.
import fix_boost_mpl_preprocess as fixmpl
import argparse
import sys
import os
import os.path
import re
import fileinput
import shutil
def create_more_container_files(sourceDir, suffix, maxElements, containers, containers2):
"""Creates additional files for the individual MPL-containers."""
# Create files for each MPL-container with 20 to 'maxElements' elements
# which will be used during generation.
for container in containers:
for i in range(20, maxElements, 10):
# Create copy of "template"-file.
newFile = os.path.join( sourceDir, container, container + str(i+10) + suffix )
shutil.copyfile( os.path.join( sourceDir, container, container + "20" + suffix ), newFile )
# Adjust copy of "template"-file accordingly.
for line in fileinput.input( newFile, inplace=1, mode="rU" ):
line = re.sub(r'20', re.escape(str(i+10)), line.rstrip())
line = re.sub(r'11', re.escape(str(i + 1)), line.rstrip())
line = re.sub(r'10(?![0-9])', re.escape(str(i)), line.rstrip())
print(line)
for container in containers2:
for i in range(20, maxElements, 10):
# Create copy of "template"-file.
newFile = os.path.join( sourceDir, container, container + str(i+10) + "_c" + suffix )
shutil.copyfile( os.path.join( sourceDir, container, container + "20_c" + suffix ), newFile )
# Adjust copy of "template"-file accordingly.
for line in fileinput.input( newFile, inplace=1, mode="rU" ):
line = re.sub(r'20', re.escape(str(i+10)), line.rstrip())
line = re.sub(r'11', re.escape(str(i + 1)), line.rstrip())
line = re.sub(r'10(?![0-9])', re.escape(str(i)), line.rstrip())
print(line)
def create_input_for_numbered_sequences(headerDir, sourceDir, containers, maxElements):
"""Creates additional source- and header-files for the numbered sequence MPL-containers."""
# Create additional container-list without "map".
containersWithoutMap = containers[:]
try:
containersWithoutMap.remove('map')
except ValueError:
# We can safely ignore if "map" is not contained in 'containers'!
pass
# Create header/source-files.
create_more_container_files(headerDir, ".hpp", maxElements, containers, containersWithoutMap)
create_more_container_files(sourceDir, ".cpp", maxElements, containers, containersWithoutMap)
def adjust_container_limits_for_variadic_sequences(headerDir, containers, maxElements):
"""Adjusts the limits of variadic sequence MPL-containers."""
for container in containers:
headerFile = os.path.join( headerDir, "limits", container + ".hpp" )
regexMatch = r'(define\s+BOOST_MPL_LIMIT_' + container.upper() + r'_SIZE\s+)[0-9]+'
regexReplace = r'\g<1>' + re.escape( str(maxElements) )
for line in fileinput.input( headerFile, inplace=1, mode="rU" ):
line = re.sub(regexMatch, regexReplace, line.rstrip())
print(line)
def current_boost_dir():
"""Returns the (relative) path to the Boost source-directory this file is located in (if any)."""
# Path to directory containing this script.
path = os.path.dirname( os.path.realpath(__file__) )
# Making sure it is located in "${boost-dir}/libs/mpl/preprocessed".
for directory in reversed( ["libs", "mpl", "preprocessed"] ):
(head, tail) = os.path.split(path)
if tail == directory:
path = head
else:
return None
return os.path.relpath( path )
def to_positive_multiple_of_10(string):
"""Converts a string into its encoded positive integer (greater zero) or throws an exception."""
try:
value = int(string)
except ValueError:
msg = '"%r" is not a positive multiple of 10 (greater zero).' % string
raise argparse.ArgumentTypeError(msg)
if value <= 0 or value % 10 != 0:
msg = '"%r" is not a positive multiple of 10 (greater zero).' % string
raise argparse.ArgumentTypeError(msg)
return value
def to_existing_absolute_path(string):
"""Converts a path into its absolute path and verifies that it exists or throws an exception."""
value = os.path.abspath(string)
if not os.path.exists( value ) or not os.path.isdir( value ):
msg = '"%r" is not a valid path to a directory.' % string
raise argparse.ArgumentTypeError(msg)
return value
def main():
"""The main function."""
# Find the current Boost source-directory in which this script is located.
sourceDir = current_boost_dir()
if sourceDir == None:
sourceDir = ""
# Prepare and run cmdline-parser.
cmdlineParser = argparse.ArgumentParser(description="A generator-script for pre-processed Boost.MPL headers.")
cmdlineParser.add_argument("-v", "--verbose", dest='verbose', action='store_true',
help="Be a little bit more verbose.")
cmdlineParser.add_argument("-s", "--sequence-type", dest='seqType', choices=['variadic', 'numbered', 'both'],
default='both',
help="Only update pre-processed headers for the selected sequence types, "
"either 'numbered' sequences, 'variadic' sequences or 'both' sequence "
"types. (Default=both)")
cmdlineParser.add_argument("--no-vector", dest='want_vector', action='store_false',
help="Do not update pre-processed headers for Boost.MPL Vector.")
cmdlineParser.add_argument("--no-list", dest='want_list', action='store_false',
help="Do not update pre-processed headers for Boost.MPL List.")
cmdlineParser.add_argument("--no-set", dest='want_set', action='store_false',
help="Do not update pre-processed headers for Boost.MPL Set.")
cmdlineParser.add_argument("--no-map", dest='want_map', action='store_false',
help="Do not update pre-processed headers for Boost.MPL Map.")
cmdlineParser.add_argument("--num-elements", dest='numElements', metavar="<num-elements>",
type=to_positive_multiple_of_10, default=100,
help="The maximal number of elements per container sequence. (Default=100)")
cmdlineParser.add_argument(dest='sourceDir', metavar="<source-dir>", default=current_boost_dir(), nargs='?',
type=to_existing_absolute_path,
help="The source-directory of Boost. (Default=\"" + sourceDir + "\")")
args = cmdlineParser.parse_args()
# Some verbose debug output.
if args.verbose:
print "Arguments extracted from command-line:"
print " verbose = ", args.verbose
print " source directory = ", args.sourceDir
print " num elements = ", args.numElements
print " sequence type = ", args.seqType
print " want: vector = ", args.want_vector
print " want: list = ", args.want_list
print " want: set = ", args.want_set
print " want: map = ", args.want_map
# Verify that we received any source-directory.
if args.sourceDir == None:
print "You should specify a valid path to the Boost source-directory."
sys.exit(0)
# The directories for header- and source files of Boost.MPL.
# NOTE: Assuming 'args.sourceDir' is the source-directory of the entire boost project.
headerDir = os.path.join( args.sourceDir, "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "libs", "mpl", "preprocessed" )
# Check that the header/source-directories exist.
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
# Maybe 'args.sourceDir' is not the source-directory of the entire boost project
# but instead of the Boost.MPL git-directory, only?
headerDir = os.path.join( args.sourceDir, "include", "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
cmdlineParser.print_usage()
print "error: Cannot find Boost.MPL header/source files in given Boost source-directory!"
sys.exit(0)
# Some verbose debug output.
if args.verbose:
print "Chosen header-directory: ", headerDir
print "Chosen source-directory: ", sourceDir
# Create list of containers for which files shall be pre-processed.
containers = []
if args.want_vector:
containers.append('vector')
if args.want_list:
containers.append('list')
if args.want_set:
containers.append('set')
if args.want_map:
containers.append('map')
if containers == []:
print "Nothing to do."
print "(Why did you prevent generating pre-processed headers for all Boost.MPL container types?)"
sys.exit(0)
# Possibly fix the header-comments of input-files needed for pre-processing.
if args.verbose:
print "Checking if prior to pre-processing some input-files need fixing."
needFixing = fixmpl.check_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose)
if needFixing:
if args.verbose:
print "Fixing of some input-files prior to pre-processing is needed."
print "Will fix them now!"
fixmpl.fix_input_files(headerDir, sourceDir, containers, args.seqType, args.verbose)
# Some verbose debug output.
if args.verbose:
print "Containers for which to pre-process headers: ", containers
# Create (additional) input files for generating pre-processed headers of numbered sequence MPL containers.
if args.seqType == "both" or args.seqType == "numbered":
create_input_for_numbered_sequences(headerDir, sourceDir, containers, args.numElements)
# Modify settings for generating pre-processed headers of variadic sequence MPL containers.
if args.seqType == "both" or args.seqType == "variadic":
adjust_container_limits_for_variadic_sequences(headerDir, containers, args.numElements)
# Generate MPL-preprocessed files.
os.chdir( sourceDir )
if args.seqType == "both" or args.seqType == "numbered":
if args.want_vector:
if args.verbose:
print "Pre-process headers for Boost.MPL numbered vectors."
os.system( "python " + os.path.join( sourceDir, "preprocess_vector.py" ) + " all " + args.sourceDir )
if args.want_list:
if args.verbose:
print "Pre-process headers for Boost.MPL numbered lists."
os.system( "python " + os.path.join( sourceDir, "preprocess_list.py" ) + " all " + args.sourceDir )
if args.want_set:
if args.verbose:
print "Pre-process headers for Boost.MPL numbered sets."
os.system( "python " + os.path.join( sourceDir, "preprocess_set.py" ) + " all " + args.sourceDir )
if args.want_map:
if args.verbose:
print "Pre-process headers for Boost.MPL numbered maps."
os.system( "python " + os.path.join( sourceDir, "preprocess_map.py" ) + " all " + args.sourceDir )
if args.seqType == "both" or args.seqType == "variadic":
if args.verbose:
print "Pre-process headers for Boost.MPL variadic containers."
os.system( "python " + os.path.join( sourceDir, "preprocess.py" ) + " all " + args.sourceDir )
if __name__ == '__main__':
main()
+205
View File
@@ -0,0 +1,205 @@
# Copyright Deniz Bahadir 2015
#
# Distributed under the Boost Software License, Version 1.0.
# (See accompanying file LICENSE_1_0.txt or copy at
# http://www.boost.org/LICENSE_1_0.txt)
#
# See http://www.boost.org/libs/mpl for documentation.
# See http://stackoverflow.com/a/29627158/3115457 for further information.
import argparse
import sys
import os.path
import re
import fileinput
import datetime
import glob
def check_header_comment(filename):
"""Checks if the header-comment of the given file needs fixing."""
# Check input file.
name = os.path.basename( filename )
# Read content of input file.
sourcefile = open( filename, "rU" )
content = sourcefile.read()
sourcefile.close()
# Search content for '$Id$'.
match = re.search(r'\$Id\$', content)
if match == None:
# Make sure that the correct value for '$Id$' was already set.
match = re.search(r'\$Id: ' + name + r'\s+[^$]+\$', content)
if match != None:
# The given file needs no fixing.
return False
# The given file needs fixing.
return True
def check_input_files_for_variadic_seq(headerDir, sourceDir):
"""Checks if files, used as input when pre-processing MPL-containers in their variadic form, need fixing."""
# Check input files in include/source-directories.
files = glob.glob( os.path.join( headerDir, "*.hpp" ) )
files += glob.glob( os.path.join( headerDir, "aux_", "*.hpp" ) )
files += glob.glob( os.path.join( sourceDir, "src", "*" ) )
for currentFile in sorted( files ):
if check_header_comment( currentFile ):
return True
return False
def check_input_files_for_numbered_seq(sourceDir, suffix, containers):
"""Check if files, used as input when pre-processing MPL-containers in their numbered form, need fixing."""
# Check input files for each MPL-container type.
for container in containers:
files = glob.glob( os.path.join( sourceDir, container, container + '*' + suffix ) )
for currentFile in sorted( files ):
if check_header_comment( currentFile ):
return True
return False
def check_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', 'map'],
seqType='both', verbose=False):
"""Checks if source- and header-files, used as input when pre-processing MPL-containers, need fixing."""
# Check the input files for containers in their variadic form.
result1 = False
if seqType == "both" or seqType == "variadic":
if verbose:
print "Check if input files for pre-processing Boost.MPL variadic containers need fixing."
result1 = check_input_files_for_variadic_seq(headerDir, sourceDir)
if verbose:
if result1:
print " At least one input file needs fixing!"
else:
print " No input file needs fixing!"
# Check the input files for containers in their numbered form.
result2 = False
result3 = False
if seqType == "both" or seqType == "numbered":
if verbose:
print "Check input files for pre-processing Boost.MPL numbered containers."
result2 = check_input_files_for_numbered_seq(headerDir, ".hpp", containers)
result3 = check_input_files_for_numbered_seq(sourceDir, ".cpp", containers)
if verbose:
if result2 or result3:
print " At least one input file needs fixing!"
else:
print " No input file needs fixing!"
# Return result.
return result1 or result2 or result3
def fix_header_comment(filename, timestamp):
"""Fixes the header-comment of the given file."""
# Fix input file.
name = os.path.basename( filename )
for line in fileinput.input( filename, inplace=1, mode="rU" ):
# If header-comment already contains anything for '$Id$', remove it.
line = re.sub(r'\$Id:[^$]+\$', r'$Id$', line.rstrip())
# Replace '$Id$' by a string containing the file's name (and a timestamp)!
line = re.sub(re.escape(r'$Id$'), r'$Id: ' + name + r' ' + timestamp.isoformat() + r' $', line.rstrip())
print(line)
def fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp):
"""Fixes files used as input when pre-processing MPL-containers in their variadic form."""
# Fix files in include/source-directories.
files = glob.glob( os.path.join( headerDir, "*.hpp" ) )
files += glob.glob( os.path.join( headerDir, "aux_", "*.hpp" ) )
files += glob.glob( os.path.join( sourceDir, "src", "*" ) )
for currentFile in sorted( files ):
fix_header_comment( currentFile, timestamp )
def fix_input_files_for_numbered_seq(sourceDir, suffix, timestamp, containers):
"""Fixes files used as input when pre-processing MPL-containers in their numbered form."""
# Fix input files for each MPL-container type.
for container in containers:
files = glob.glob( os.path.join( sourceDir, container, container + '*' + suffix ) )
for currentFile in sorted( files ):
fix_header_comment( currentFile, timestamp )
def fix_input_files(headerDir, sourceDir, containers=['vector', 'list', 'set', 'map'],
seqType='both', verbose=False):
"""Fixes source- and header-files used as input when pre-processing MPL-containers."""
# The new modification time.
timestamp = datetime.datetime.now();
# Fix the input files for containers in their variadic form.
if seqType == "both" or seqType == "variadic":
if verbose:
print "Fix input files for pre-processing Boost.MPL variadic containers."
fix_input_files_for_variadic_seq(headerDir, sourceDir, timestamp)
# Fix the input files for containers in their numbered form.
if seqType == "both" or seqType == "numbered":
if verbose:
print "Fix input files for pre-processing Boost.MPL numbered containers."
fix_input_files_for_numbered_seq(headerDir, ".hpp", timestamp, containers)
fix_input_files_for_numbered_seq(sourceDir, ".cpp", timestamp, containers)
def to_existing_absolute_path(string):
"""Converts a path into its absolute path and verifies that it exists or throws an exception."""
value = os.path.abspath(string)
if not os.path.exists( value ) or not os.path.isdir( value ):
msg = '"%r" is not a valid path to a directory.' % string
raise argparse.ArgumentTypeError(msg)
return value
def main():
"""The main function."""
# Prepare and run cmdline-parser.
cmdlineParser = argparse.ArgumentParser(
description="Fixes the input files used for pre-processing of Boost.MPL headers.")
cmdlineParser.add_argument("-v", "--verbose", dest='verbose', action='store_true',
help="Be a little bit more verbose.")
cmdlineParser.add_argument("--check-only", dest='checkonly', action='store_true',
help="Only checks if fixing is required.")
cmdlineParser.add_argument(dest='sourceDir', metavar="<source-dir>",
type=to_existing_absolute_path,
help="The source-directory of Boost.")
args = cmdlineParser.parse_args()
# Some verbose debug output.
if args.verbose:
print "Arguments extracted from command-line:"
print " verbose = ", args.verbose
print " check-only = ", args.checkonly
print " source directory = ", args.sourceDir
# The directories for header- and source files of Boost.MPL.
# NOTE: Assuming 'args.sourceDir' is the source-directory of the entire boost project.
headerDir = os.path.join( args.sourceDir, "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "libs", "mpl", "preprocessed" )
# Check that the header/source-directories exist.
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
# Maybe 'args.sourceDir' is not the source-directory of the entire boost project
# but instead of the Boost.MPL git-directory, only?
headerDir = os.path.join( args.sourceDir, "include", "boost", "mpl" )
sourceDir = os.path.join( args.sourceDir, "preprocessed" )
if not os.path.exists( headerDir ) or not os.path.exists( sourceDir ):
cmdlineParser.print_usage()
print "error: Cannot find Boost.MPL header/source files in given Boost source-directory!"
sys.exit(0)
# Some verbose debug output.
if args.verbose:
print "Chosen header-directory: ", headerDir
print "Chosen source-directory: ", sourceDir
if args.checkonly:
# Check input files for generating pre-processed headers.
result = check_input_files(headerDir, sourceDir, verbose = args.verbose)
if result:
print "Fixing the input-files used for pre-processing of Boost.MPL headers IS required."
else:
print "Fixing the input-files used for pre-processing of Boost.MPL headers is NOT required."
else:
# Fix input files for generating pre-processed headers.
fix_input_files(headerDir, sourceDir, verbose = args.verbose)
if __name__ == '__main__':
main()
-26
View File
@@ -1,26 +0,0 @@
// Copyright Aleksey Gurtovoy 2003-2004
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#define BOOST_NO_CONFIG
#define BOOST_MSVC 1200
#define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
#define BOOST_NO_TEMPLATE_TEMPLATES
#define BOOST_NO_CV_VOID_SPECIALIZATIONS
#define BOOST_NO_INTRINSIC_WCHAR_T
#define BOOST_NO_STD_ALLOCATOR
#define BOOST_MPL_CFG_NO_BIND_TEMPLATE
#define BOOST_MPL_CFG_NO_APPLY_TEMPLATE
#define BOOST_MPL_CFG_MSVC_60_ETI_BUG
#define BOOST_MPL_CFG_MSVC_ETI_BUG
#define BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC
-21
View File
@@ -1,21 +0,0 @@
// Copyright Aleksey Gurtovoy 2003-2004
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#define BOOST_NO_CONFIG
#define BOOST_MSVC 1300
#define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
#define BOOST_NO_INCLASS_MEMBER_INITIALIZATION
#define BOOST_MPL_CFG_NO_BIND_TEMPLATE
#define BOOST_MPL_CFG_NO_APPLY_TEMPLATE
#define BOOST_MPL_CFG_MSVC_ETI_BUG
#define BOOST_MPL_CFG_NO_NESTED_VALUE_ARITHMETIC
-15
View File
@@ -1,15 +0,0 @@
// Copyright Aleksey Gurtovoy 2003-2004
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#define BOOST_NO_CONFIG
#define BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+1 -1
View File
@@ -82,7 +82,7 @@ def main( all_modes, src_dir, dst_dir ):
if __name__ == '__main__':
main(
["bcc", "bcc551", "gcc", "msvc60", "msvc70", "mwcw", "dmc", "no_ctps", "no_ttp", "plain"]
["bcc", "bcc551", "gcc", "mwcw", "dmc", "no_ttp", "plain"]
, "src"
, os.path.join( "boost", "mpl", "aux_", "preprocessed" )
)
+1 -1
View File
@@ -15,7 +15,7 @@ import preprocess
import os.path
preprocess.main(
[ "plain", "typeof_based", "no_ctps" ]
[ "plain", "typeof_based" ]
, "map"
, os.path.join( "boost", "mpl", "map", "aux_", "preprocessed" )
)
+1 -1
View File
@@ -15,7 +15,7 @@ import preprocess
import os.path
preprocess.main(
[ "no_ctps", "plain", "typeof_based" ]
[ "plain", "typeof_based" ]
, "vector"
, os.path.join( "boost", "mpl", "vector", "aux_", "preprocessed" )
)
+1
View File
@@ -1,4 +1,5 @@
compile aux_/increased_arity.cpp ;
compile aux_/largest_int.cpp ;
compile aux_/msvc_is_class.cpp ;
compile aux_/template_arity.cpp ;
+9 -3
View File
@@ -1,8 +1,8 @@
// Copyright Aleksey Gurtovoy 2000-2004
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
@@ -22,6 +22,8 @@ MPL_TEST_CASE()
{
typedef always<true_> always_true;
MPL_ASSERT(( apply< always_true > ));
MPL_ASSERT(( apply0< always_true > ));
MPL_ASSERT(( apply1< always_true,false_ > ));
MPL_ASSERT(( apply2< always_true,false_,false_ > ));
MPL_ASSERT(( apply3< always_true,false_,false_,false_ > ));
@@ -30,12 +32,16 @@ MPL_TEST_CASE()
MPL_TEST_CASE()
{
typedef always< int_<10> > always_10;
typedef always< int_<10> > always_10;
typedef apply< always_10 >::type res;
typedef apply0< always_10 >::type res0;
typedef apply1< always_10,int_<0> >::type res1;
typedef apply2< always_10,int_<0>,int_<0> >::type res2;
typedef apply3< always_10,int_<0>,int_<0>,int_<0> >::type res3;
MPL_ASSERT_RELATION( res::value, ==, 10 );
MPL_ASSERT_RELATION( res0::value, ==, 10 );
MPL_ASSERT_RELATION( res1::value, ==, 10 );
MPL_ASSERT_RELATION( res2::value, ==, 10 );
MPL_ASSERT_RELATION( res3::value, ==, 10 );
+2 -2
View File
@@ -76,7 +76,7 @@ MPL_TEST_CASE()
typedef apply1< _1, std_vector<_1> >::type v_lambda;
typedef apply1<v_lambda,int>::type v_int;
MPL_ASSERT(( is_same< v,std_vector<int> > ));
MPL_ASSERT(( is_same< v_int,std_vector<int> > ));
}
MPL_TEST_CASE()
@@ -86,7 +86,7 @@ MPL_TEST_CASE()
typedef apply1< lambda<_1>, std_vector<_1> >::type make_vector;
typedef apply_wrap1< make_vector,int >::type v_int;
MPL_ASSERT(( is_same< v,std_vector<int> > ));
MPL_ASSERT(( is_same< v_int,std_vector<int> > ));
}
MPL_TEST_CASE()
+11
View File
@@ -71,6 +71,17 @@ struct her
}
};
template<class T>
struct nested : boost::mpl::true_ {
BOOST_MPL_ASSERT(( boost::is_pointer<T*> ));
BOOST_MPL_ASSERT_NOT(( boost::is_same<void,T> ));
BOOST_MPL_ASSERT_RELATION( sizeof(T*), >, 1 );
BOOST_MPL_ASSERT_MSG( true, GLOBAL_SCOPE_ERROR, (int,long) );
};
BOOST_MPL_ASSERT(( nested<int> ));
BOOST_MPL_ASSERT_NOT(( boost::mpl::not_<nested<unsigned> > ));
int main()
{
her<void> h;
+50
View File
@@ -0,0 +1,50 @@
// Copyright Bruno Dutra 2015
//
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
//
// See http://www.boost.org/libs/mpl for documentation.
// $Id$
// $Date$
// $Revision$
#define BOOST_MPL_LIMIT_METAFUNCTION_ARITY 15
#define BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS
#include <boost/mpl/logical.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/apply.hpp>
#include <boost/mpl/aux_/test.hpp>
#include <boost/preprocessor/inc.hpp>
#include <boost/preprocessor/repeat_from_to.hpp>
#include <boost/preprocessor/enum_params.hpp>
#include <boost/preprocessor/facilities/intercept.hpp>
#define TEST_N_ARY(unused1, N, unused2) \
static_assert_< \
apply< \
and_<BOOST_PP_ENUM_PARAMS(N, _ BOOST_PP_INTERCEPT)>, \
BOOST_PP_ENUM_PARAMS(N, true_ BOOST_PP_INTERCEPT) \
> \
>(); \
/**/
template<typename assertion>
void static_assert_(){
MPL_ASSERT((typename assertion::type));
}
MPL_TEST_CASE()
{
BOOST_PP_REPEAT_FROM_TO(
2,
BOOST_PP_INC(BOOST_MPL_LIMIT_METAFUNCTION_ARITY),
TEST_N_ARY,
_
)
}
+6 -6
View File
@@ -37,9 +37,9 @@ MPL_TEST_CASE()
MPL_ASSERT_RELATION( (bitor_<_0,_0>::value), ==, 0 );
MPL_ASSERT_RELATION( (bitor_<_1,_0>::value), ==, 1 );
MPL_ASSERT_RELATION( (bitor_<_0,_1>::value), ==, 1 );
MPL_ASSERT_RELATION( (bitor_<_0,_ffffffff>::value), ==, 0xffffffff );
MPL_ASSERT_RELATION( (bitor_<_1,_ffffffff>::value), ==, 0xffffffff );
MPL_ASSERT_RELATION( (bitor_<_8,_ffffffff>::value), ==, 0xffffffff );
MPL_ASSERT_RELATION( static_cast<long>(bitor_<_0,_ffffffff>::value), ==, static_cast<long>(0xffffffff) );
MPL_ASSERT_RELATION( static_cast<long>(bitor_<_1,_ffffffff>::value), ==, static_cast<long>(0xffffffff) );
MPL_ASSERT_RELATION( static_cast<long>(bitor_<_8,_ffffffff>::value), ==, static_cast<long>(0xffffffff) );
}
MPL_TEST_CASE()
@@ -47,9 +47,9 @@ MPL_TEST_CASE()
MPL_ASSERT_RELATION( (bitxor_<_0,_0>::value), ==, 0 );
MPL_ASSERT_RELATION( (bitxor_<_1,_0>::value), ==, 1 );
MPL_ASSERT_RELATION( (bitxor_<_0,_1>::value), ==, 1 );
MPL_ASSERT_RELATION( (bitxor_<_0,_ffffffff>::value), ==, (0xffffffff ^ 0) );
MPL_ASSERT_RELATION( (bitxor_<_1,_ffffffff>::value), ==, (0xffffffff ^ 1) );
MPL_ASSERT_RELATION( (bitxor_<_8,_ffffffff>::value), ==, (0xffffffff ^ 8) );
MPL_ASSERT_RELATION( static_cast<long>(bitxor_<_0,_ffffffff>::value), ==, static_cast<long>(0xffffffff ^ 0) );
MPL_ASSERT_RELATION( static_cast<long>(bitxor_<_1,_ffffffff>::value), ==, static_cast<long>(0xffffffff ^ 1) );
MPL_ASSERT_RELATION( static_cast<long>(bitxor_<_8,_ffffffff>::value), ==, static_cast<long>(0xffffffff ^ 8) );
}
MPL_TEST_CASE()
+7
View File
@@ -16,11 +16,18 @@
#include <cassert>
#if defined(BOOST_NO_CXX11_CONSTEXPR)
#define CONSTEXPR_BOOL_TEST(c)
#else
#define CONSTEXPR_BOOL_TEST(c) { static_assert(bool_<c>() == c, "Constexpr for bool_ failed"); }
#endif
#define BOOL_TEST(c) \
{ MPL_ASSERT(( is_same< bool_<c>::value_type, bool > )); } \
{ MPL_ASSERT(( is_same< bool_<c>, c##_ > )); } \
{ MPL_ASSERT(( is_same< bool_<c>::type, bool_<c> > )); } \
{ MPL_ASSERT_RELATION( bool_<c>::value, ==, c ); } \
CONSTEXPR_BOOL_TEST(c) \
BOOST_TEST( bool_<c>() == c ); \
/**/
+3
View File
@@ -17,6 +17,7 @@
#include <boost/mpl/distance.hpp>
#include <boost/mpl/advance.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/aux_/test.hpp>
#include <boost/type_traits/is_same.hpp>
@@ -33,4 +34,6 @@ MPL_TEST_CASE()
typedef advance_c<begin,0>::type advanced;
MPL_ASSERT(( is_same<advanced,end> ));
MPL_ASSERT(( equal< empty_sequence, empty_sequence::type > ));
}
+5
View File
@@ -18,6 +18,7 @@
#include <boost/mpl/list.hpp>
#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/deref.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/aux_/test.hpp>
#include <boost/type_traits/is_float.hpp>
@@ -26,6 +27,10 @@
MPL_TEST_CASE()
{
typedef mpl::list<int,float,long,float,char[50],long double,char> types;
typedef mpl::list<float,float,long double> floats;
MPL_ASSERT(( equal< mpl::filter_view< types,boost::is_float<_> >::type,floats > ));
typedef mpl::max_element<
mpl::transform_view<
mpl::filter_view< types,boost::is_float<_> >
+38
View File
@@ -15,9 +15,17 @@
#include <boost/mpl/find.hpp>
#include <boost/mpl/vector_c.hpp>
#include <boost/mpl/list.hpp>
#include <boost/mpl/set.hpp>
#include <boost/mpl/set_c.hpp>
#include <boost/mpl/map.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/range_c.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/fold.hpp>
#include <boost/mpl/placeholders.hpp>
#include <boost/mpl/logical.hpp>
#include <boost/mpl/contains.hpp>
#include <boost/mpl/joint_view.hpp>
#include <boost/mpl/aux_/test.hpp>
@@ -33,3 +41,33 @@ MPL_TEST_CASE()
typedef insert_range< list0<>,end< list0<> >::type,list1<int> >::type result2;
MPL_ASSERT_RELATION( size<result2>::value, ==, 1 );
}
template<typename A, typename B>
void test_associative()
{
typedef typename insert_range< A,typename end< A >::type,B >::type C;
MPL_ASSERT_RELATION( size<C>::value, <=, (size<A>::value + size<B>::value) );
MPL_ASSERT(( fold< joint_view< A,B >,true_,and_< _1,contains< C,_2 > > > ));
}
MPL_TEST_CASE()
{
typedef set3< short,int,long > signed_integers;
typedef set3< unsigned short,unsigned int,unsigned long > unsigned_integers;
test_associative<signed_integers, unsigned_integers>();
typedef set_c< int,1,3,5,7,9 > odds;
typedef set_c< int,0,2,4,6,8 > evens;
test_associative<odds, evens>();
typedef map2<
pair< void,void* >
, pair< int,int* >
> pointers;
typedef map2<
pair< void const,void const* >
, pair< int const,int const* >
> pointers_to_const;
test_associative<pointers, pointers_to_const>();
}
+8
View File
@@ -28,6 +28,12 @@
/**/
#endif
#if defined(BOOST_NO_CXX11_CONSTEXPR)
#define CONSTEXPR_INTEGRAL_TEST(T, i)
#else
#define CONSTEXPR_INTEGRAL_TEST(T, i) { static_assert(T() == i, "Constexpr for integral constant failed"); }
#endif
#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
// agurt 20/nov/06: see http://article.gmane.org/gmane.comp.lib.boost.devel/151065
#define INTEGRAL_WRAPPER_TEST(unused1, i, T) \
@@ -39,6 +45,7 @@
{ MPL_ASSERT(( is_same< next< borland_tested_type >::type, WRAPPER(T,i+1) > )); } \
{ MPL_ASSERT(( is_same< prior< borland_tested_type >::type, WRAPPER(T,i-1) > )); } \
{ MPL_ASSERT_RELATION( (borland_tested_type::value), ==, i ); } \
CONSTEXPR_INTEGRAL_TEST(borland_tested_type, i) \
INTEGRAL_WRAPPER_RUNTIME_TEST(i, T) \
} \
/**/
@@ -49,6 +56,7 @@
{ MPL_ASSERT(( is_same< next< WRAPPER(T,i) >::type, WRAPPER(T,i+1) > )); } \
{ MPL_ASSERT(( is_same< prior< WRAPPER(T,i) >::type, WRAPPER(T,i-1) > )); } \
{ MPL_ASSERT_RELATION( (WRAPPER(T,i)::value), ==, i ); } \
CONSTEXPR_INTEGRAL_TEST(WRAPPER(T,i), i) \
INTEGRAL_WRAPPER_RUNTIME_TEST(i, T) \
/**/
#endif
+1
View File
@@ -30,6 +30,7 @@ MPL_TEST_CASE()
typedef range_c<int,0,15> answer;
MPL_ASSERT(( equal<numbers,answer> ));
MPL_ASSERT(( equal<numbers::type,answer> ));
MPL_ASSERT_RELATION( size<numbers>::value, ==, 15 );
}
+16
View File
@@ -217,3 +217,19 @@ MPL_TEST_CASE()
>
));
}
MPL_TEST_CASE()
{
typedef insert< map<>, pair<int,int> >::type little_map;
MPL_ASSERT_RELATION(size<little_map>::value, ==, 1);
MPL_ASSERT_RELATION(size<little_map::type>::value, ==, 1);
}
MPL_TEST_CASE()
{
typedef erase_key< map< pair<float,float>, pair<int,int> >, float >::type little_map;
MPL_ASSERT_RELATION(size<little_map>::value, ==, 1);
MPL_ASSERT_RELATION(size<little_map::type>::value, ==, 1);
}
+16
View File
@@ -329,3 +329,19 @@ MPL_TEST_CASE()
find_test<s>();
find_test<s::type>();
}
MPL_TEST_CASE()
{
typedef insert< set<>, int >::type little_set;
MPL_ASSERT_RELATION(size<little_set>::value, ==, 1);
MPL_ASSERT_RELATION(size<little_set::type>::value, ==, 1);
}
MPL_TEST_CASE()
{
typedef erase_key< set< float, int >, float >::type little_set;
MPL_ASSERT_RELATION(size<little_set>::value, ==, 1);
MPL_ASSERT_RELATION(size<little_set::type>::value, ==, 1);
}
+21
View File
@@ -14,6 +14,7 @@
#include <boost/mpl/set_c.hpp>
#include <boost/mpl/at.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/aux_/test.hpp>
@@ -59,6 +60,18 @@ MPL_TEST_CASE()
MPL_ASSERT(( is_same< test::at_c<s1,false>::type, void_ > ));
MPL_ASSERT(( is_same< test::at_c<s2,true>::type, void_ > ));
#endif
typedef begin<s1>::type first1;
typedef end<s1>::type last1;
MPL_ASSERT_RELATION( (distance<first1, last1>::value), ==, 1 );
typedef begin<s2>::type first2;
typedef end<s2>::type last2;
MPL_ASSERT_RELATION( (distance<first2, last2>::value), ==, 1 );
typedef begin<s3>::type first3;
typedef end<s3>::type last3;
MPL_ASSERT_RELATION( (distance<first3, last3>::value), ==, 2 );
}
#endif
@@ -82,4 +95,12 @@ MPL_TEST_CASE()
MPL_ASSERT(( is_same< test::at_c<s1,'z'>::type, void_ > ));
MPL_ASSERT(( is_same< test::at_c<s2,'k'>::type, void_ > ));
#endif
typedef begin<s1>::type first1;
typedef end<s1>::type last1;
MPL_ASSERT_RELATION( (distance<first1, last1>::value), ==, 1 );
typedef begin<s2>::type first2;
typedef end<s2>::type last2;
MPL_ASSERT_RELATION( (distance<first2, last2>::value), ==, 8 );
}
+3
View File
@@ -15,6 +15,7 @@
#include <boost/mpl/advance.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/begin_end.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/aux_/test.hpp>
MPL_TEST_CASE()
@@ -37,4 +38,6 @@ MPL_TEST_CASE()
MPL_ASSERT_RELATION( (mpl::distance<last,last>::value), ==, 0 );
MPL_ASSERT_RELATION( size<view>::value, ==, 1 );
MPL_ASSERT(( equal< view, view::type > ));
}
+11 -1
View File
@@ -16,12 +16,22 @@
#include <boost/mpl/max_element.hpp>
#include <boost/mpl/list.hpp>
#include <boost/mpl/sizeof.hpp>
#include <boost/mpl/equal.hpp>
#include <boost/mpl/aux_/test.hpp>
MPL_TEST_CASE()
{
typedef list<int,long,char,char[50],double> types;
typedef list<
sizeof_<int>::type,
sizeof_<long>::type,
sizeof_<char>::type,
sizeof_<char[50]>::type,
sizeof_<double>::type
> sizes;
MPL_ASSERT(( equal< transform_view< types, sizeof_<_> >::type,sizes > ));
typedef max_element<
transform_view< types, sizeof_<_> >
>::type iter;