benchcc 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +6 -0
- data/Gemfile +13 -0
- data/LICENSE.md +25 -0
- data/README.md +3 -0
- data/Rakefile +11 -0
- data/benchcc.gemspec +24 -0
- data/benchmarks/Rakefile +78 -0
- data/benchmarks/fmap/_env.rb +3 -0
- data/benchmarks/fmap/_main.erb +7 -0
- data/benchmarks/fmap/hana_list.erb.cpp +18 -0
- data/benchmarks/fmap/mpl11_list.erb.cpp +15 -0
- data/benchmarks/fmap/mpl_list.erb.cpp +15 -0
- data/benchmarks/fmap/mpl_vector.erb.cpp +15 -0
- data/benchmarks/include/_env.rb +1 -0
- data/benchmarks/include/hana.erb.cpp +1 -0
- data/benchmarks/include/mpl.erb.cpp +185 -0
- data/benchmarks/include/mpl11.erb.cpp +1 -0
- data/benchmarks/include/mpl11.min.erb.cpp +1 -0
- data/benchmarks/sum/_env.rb +3 -0
- data/benchmarks/sum/_main.erb +4 -0
- data/benchmarks/sum/constexpr.erb.cpp +24 -0
- data/benchmarks/sum/mpl11_variadic_foldl.erb.cpp +16 -0
- data/benchmarks/tuple_create/_env.rb +3 -0
- data/benchmarks/tuple_create/boost_tuple.erb.cpp +6 -0
- data/benchmarks/tuple_create/fusion_tuple.erb.cpp +6 -0
- data/benchmarks/tuple_create/hana_list.erb.cpp +6 -0
- data/benchmarks/tuple_create/std_tuple.erb.cpp +6 -0
- data/benchmarks/tuple_last/_env.rb +3 -0
- data/benchmarks/tuple_last/boost_tuple.erb.cpp +7 -0
- data/benchmarks/tuple_last/fusion_tuple.erb.cpp +7 -0
- data/benchmarks/tuple_last/hana_list.erb.cpp +7 -0
- data/benchmarks/tuple_last/std_tuple.erb.cpp +7 -0
- data/benchmarks/type_foldl/_env.rb +3 -0
- data/benchmarks/type_foldl/_main.erb +18 -0
- data/benchmarks/type_foldl/hana_list.erb.cpp +15 -0
- data/benchmarks/type_foldl/mpl11_cons.erb.cpp +10 -0
- data/benchmarks/type_foldl/mpl11_list.erb.cpp +8 -0
- data/benchmarks/type_foldl/mpl_list.erb.cpp +7 -0
- data/benchmarks/type_foldl/mpl_vector.erb.cpp +7 -0
- data/benchmarks/value_foldl/_env.rb +3 -0
- data/benchmarks/value_foldl/_main.erb +17 -0
- data/benchmarks/value_foldl/fusion_cons.erb.cpp +8 -0
- data/benchmarks/value_foldl/fusion_list.erb.cpp +9 -0
- data/benchmarks/value_foldl/fusion_vector.erb.cpp +9 -0
- data/benchmarks/value_foldl/hana_list.erb.cpp +6 -0
- data/lib/benchcc/benchmark.rb +53 -0
- data/lib/benchcc/compiler.rb +134 -0
- data/lib/benchcc/ext/enumerable.rb +7 -0
- data/lib/benchcc/ext/file.rb +16 -0
- data/lib/benchcc/ext/gnuplot.rb +8 -0
- data/lib/benchcc/ext/numeric.rb +15 -0
- data/lib/benchcc/ext/string.rb +5 -0
- data/lib/benchcc/fusion.rb +54 -0
- data/lib/benchcc/mpl.rb +48 -0
- data/lib/benchcc/plot.rb +44 -0
- data/lib/benchcc/version.rb +3 -0
- data/lib/benchcc.rb +6 -0
- data/spec/benchmark_spec.rb +23 -0
- data/spec/compiler_spec.rb +69 -0
- data/spec/numeric_spec.rb +23 -0
- data/spec/plot_spec.rb +29 -0
- data/spec/src/invalid.cpp +1 -0
- data/spec/src/plot.csv +3 -0
- data/spec/src/valid.cpp +1 -0
- metadata +166 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: c435cda71ad508017a69a33b232ef6a7ed334df8
|
4
|
+
data.tar.gz: c2c9a7bd9355414ea1388f7e792b630a3a0b79c8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: da5d488a8e4cdb1984cb174c6b622dcba891d588bd734c9421f02dd6c412d1c243b307b09b0f4c3fba7476342a9acbfb520818abdbe80714dbebac666e9a4812
|
7
|
+
data.tar.gz: c5ab9643575c8d740e5521e8ed8ad04d78751488a30773b951a4bdb57a0fbf1319d75c4e3d3c4b6734f67647b2f394abd1ec9716907b9ebe3081479dc67a48aa
|
data/.gitignore
ADDED
data/.gitmodules
ADDED
data/Gemfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
Copyright 2014 Louis Dionne
|
2
|
+
|
3
|
+
Boost Software License - Version 1.0 - August 17th, 2003
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person or organization
|
6
|
+
obtaining a copy of the software and accompanying documentation covered by
|
7
|
+
this license (the "Software") to use, reproduce, display, distribute,
|
8
|
+
execute, and transmit the Software, and to prepare derivative works of the
|
9
|
+
Software, and to permit third-parties to whom the Software is furnished to
|
10
|
+
do so, all subject to the following:
|
11
|
+
|
12
|
+
The copyright notices in the Software and this entire statement, including
|
13
|
+
the above license grant, this restriction and the following disclaimer,
|
14
|
+
must be included in all copies of the Software, in whole or in part, and
|
15
|
+
all derivative works of the Software, unless such copies or derivative
|
16
|
+
works are solely in the form of machine-executable object code generated by
|
17
|
+
a source language processor.
|
18
|
+
|
19
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
20
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
21
|
+
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
22
|
+
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
23
|
+
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
24
|
+
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
25
|
+
DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
data/Rakefile
ADDED
data/benchcc.gemspec
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
$:.unshift File.expand_path('../lib', __FILE__)
|
4
|
+
require 'benchcc/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "benchcc"
|
8
|
+
s.version = Benchcc::VERSION
|
9
|
+
s.authors = ["Louis Dionne"]
|
10
|
+
s.email = ["ldionne.2@gmail.com"]
|
11
|
+
s.homepage = "https://github.com/ldionne/benchcc"
|
12
|
+
s.license = "Boost"
|
13
|
+
s.summary = "A collection of utilities to benchmark C++ metaprograms"
|
14
|
+
s.description = "Benchcc is a collection of utilities to make easier the task of benchmarking C++ metaprograms"
|
15
|
+
|
16
|
+
s.files = `git ls-files -z`.split("\x0")
|
17
|
+
s.platform = Gem::Platform::RUBY
|
18
|
+
s.require_paths = ["lib"]
|
19
|
+
|
20
|
+
s.add_dependency 'gnuplot', "~> 2.6"
|
21
|
+
s.add_dependency 'rake', "~> 10.2"
|
22
|
+
s.add_dependency 'ruby-progressbar', "~> 1.4"
|
23
|
+
s.add_dependency 'tilt', '~> 2.0.1'
|
24
|
+
end
|
data/benchmarks/Rakefile
ADDED
@@ -0,0 +1,78 @@
|
|
1
|
+
$:.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
|
3
|
+
require 'benchcc'
|
4
|
+
require 'csv'
|
5
|
+
require 'gnuplot'
|
6
|
+
|
7
|
+
|
8
|
+
task :default => [:all]
|
9
|
+
task :all
|
10
|
+
|
11
|
+
INCLUDES = %w{boost.hana/include boost.mpl11/include}.map { |path|
|
12
|
+
"-I " + File.expand_path("../../ext/#{path}", __FILE__)
|
13
|
+
}
|
14
|
+
|
15
|
+
|
16
|
+
Benchcc::Compiler.list.product(Dir['*']) do |compiler, dir|
|
17
|
+
benchmark = File.basename(dir)
|
18
|
+
bm = Benchcc::Benchmark.new(benchmark)
|
19
|
+
bm.implementations.each do |implementation|
|
20
|
+
task :all => benchmark
|
21
|
+
task compiler.id => "#{compiler.id}.#{benchmark}"
|
22
|
+
task benchmark => "#{compiler.id}.#{benchmark}"
|
23
|
+
task "#{compiler.id}.#{benchmark}" => "#{compiler.id}.#{benchmark}.#{implementation}"
|
24
|
+
task "#{compiler.id}.#{benchmark}.#{implementation}" => "_datasets/#{compiler.id}/#{benchmark}/#{implementation}"
|
25
|
+
|
26
|
+
file "_datasets/#{compiler.id}/#{benchmark}/#{implementation}" => [
|
27
|
+
bm.dependencies_of(implementation),
|
28
|
+
directory("_datasets/#{compiler.id}/#{benchmark}").name
|
29
|
+
].flatten do |ofile|
|
30
|
+
data = bm.run(implementation) { |code|
|
31
|
+
compiler.compile_code(code, *INCLUDES, "-fsyntax-only")
|
32
|
+
}
|
33
|
+
|
34
|
+
CSV.open(ofile.name, 'wb') do |csv|
|
35
|
+
csv << data.first.keys unless data.empty?
|
36
|
+
data.each { |line| csv << line.values }
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
task :memusg do |t, args|
|
44
|
+
Gnuplot.open do |io|
|
45
|
+
Gnuplot::Plot.new(io) do |plot|
|
46
|
+
plot.ylabel 'Memory usage'
|
47
|
+
plot.decimal "locale 'en_US.UTF-8'"
|
48
|
+
plot.format 'y "%.2e kb"'
|
49
|
+
plot.term 'png'
|
50
|
+
plot.output 'memusg.png'
|
51
|
+
plot.data = args.extras.map { |arg|
|
52
|
+
csv = CSV.table("_datasets/#{arg}")
|
53
|
+
Gnuplot::DataSet.new([csv[:depth], csv[:peak_memusg]]) { |ds|
|
54
|
+
ds.title = arg
|
55
|
+
ds.with = 'lines'
|
56
|
+
}
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
task :time do |t, args|
|
63
|
+
Gnuplot.open do |io|
|
64
|
+
Gnuplot::Plot.new(io) do |plot|
|
65
|
+
plot.ylabel 'Compilation time'
|
66
|
+
plot.format 'y "%.2g s"'
|
67
|
+
plot.term 'png'
|
68
|
+
plot.output 'time.png'
|
69
|
+
plot.data = args.extras.map { |arg|
|
70
|
+
csv = CSV.table("_datasets/#{arg}")
|
71
|
+
Gnuplot::DataSet.new([csv[:depth], csv[:wall_time]]) { |ds|
|
72
|
+
ds.title = arg
|
73
|
+
ds.with = 'lines'
|
74
|
+
}
|
75
|
+
}
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
#include <boost/hana/list.hpp>
|
2
|
+
|
3
|
+
|
4
|
+
template <typename X>
|
5
|
+
struct _f { };
|
6
|
+
|
7
|
+
constexpr struct {
|
8
|
+
template <typename X>
|
9
|
+
constexpr _f<X> operator()(X) const;
|
10
|
+
} f{};
|
11
|
+
|
12
|
+
<%=
|
13
|
+
render('_main.erb') do |xs, breadth, depth|
|
14
|
+
xs = xs.map { |x| "#{x}{}" }.join(', ')
|
15
|
+
list = "boost::hana::list(#{xs})"
|
16
|
+
"static const auto go#{breadth} = boost::hana::fmap(f, #{list});"
|
17
|
+
end
|
18
|
+
%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <boost/mpl11/list.hpp>
|
2
|
+
|
3
|
+
|
4
|
+
struct f {
|
5
|
+
using type = f;
|
6
|
+
template <typename>
|
7
|
+
struct apply { struct type; };
|
8
|
+
};
|
9
|
+
|
10
|
+
<%=
|
11
|
+
render('_main.erb') do |xs, breadth, depth|
|
12
|
+
list = "boost::mpl11::list<#{xs.join(', ')}>"
|
13
|
+
"using go#{breadth} = boost::mpl11::fmap<f, #{list}>::type;"
|
14
|
+
end
|
15
|
+
%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <boost/mpl/transform.hpp>
|
2
|
+
<%= Benchcc::MPL::List.new(0...depth).includes %>
|
3
|
+
|
4
|
+
|
5
|
+
struct f {
|
6
|
+
template <typename>
|
7
|
+
struct apply { struct type; };
|
8
|
+
};
|
9
|
+
|
10
|
+
<%=
|
11
|
+
render('_main.erb') do |xs, breadth, depth|
|
12
|
+
list = Benchcc::MPL::List.new(xs)
|
13
|
+
"using go#{breadth} = boost::mpl::transform<#{list}, f>::type;"
|
14
|
+
end
|
15
|
+
%>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <boost/mpl/transform.hpp>
|
2
|
+
<%= Benchcc::MPL::Vector.new(0...depth).includes %>
|
3
|
+
|
4
|
+
|
5
|
+
struct f {
|
6
|
+
template <typename>
|
7
|
+
struct apply { struct type; };
|
8
|
+
};
|
9
|
+
|
10
|
+
<%=
|
11
|
+
render('_main.erb') do |xs, breadth, depth|
|
12
|
+
vector = Benchcc::MPL::Vector.new(xs)
|
13
|
+
"using go#{breadth} = boost::mpl::transform<#{vector}, f>::type;"
|
14
|
+
end
|
15
|
+
%>
|
@@ -0,0 +1 @@
|
|
1
|
+
1.times.map { Hash.new }
|
@@ -0,0 +1 @@
|
|
1
|
+
#include <boost/hana.hpp>
|
@@ -0,0 +1,185 @@
|
|
1
|
+
#include <boost/mpl/accumulate.hpp>
|
2
|
+
#include <boost/mpl/advance.hpp>
|
3
|
+
#include <boost/mpl/advance_fwd.hpp>
|
4
|
+
#include <boost/mpl/alias.hpp>
|
5
|
+
#include <boost/mpl/always.hpp>
|
6
|
+
#include <boost/mpl/and.hpp>
|
7
|
+
#include <boost/mpl/apply.hpp>
|
8
|
+
#include <boost/mpl/apply_fwd.hpp>
|
9
|
+
#include <boost/mpl/apply_wrap.hpp>
|
10
|
+
#include <boost/mpl/arg.hpp>
|
11
|
+
#include <boost/mpl/arg_fwd.hpp>
|
12
|
+
#include <boost/mpl/arithmetic.hpp>
|
13
|
+
#include <boost/mpl/as_sequence.hpp>
|
14
|
+
#include <boost/mpl/assert.hpp>
|
15
|
+
#include <boost/mpl/at.hpp>
|
16
|
+
#include <boost/mpl/at_fwd.hpp>
|
17
|
+
#include <boost/mpl/back.hpp>
|
18
|
+
#include <boost/mpl/back_fwd.hpp>
|
19
|
+
#include <boost/mpl/back_inserter.hpp>
|
20
|
+
#include <boost/mpl/base.hpp>
|
21
|
+
#include <boost/mpl/begin.hpp>
|
22
|
+
#include <boost/mpl/begin_end.hpp>
|
23
|
+
#include <boost/mpl/begin_end_fwd.hpp>
|
24
|
+
#include <boost/mpl/bind.hpp>
|
25
|
+
#include <boost/mpl/bind_fwd.hpp>
|
26
|
+
#include <boost/mpl/bitand.hpp>
|
27
|
+
#include <boost/mpl/bitor.hpp>
|
28
|
+
#include <boost/mpl/bitwise.hpp>
|
29
|
+
#include <boost/mpl/bitxor.hpp>
|
30
|
+
#include <boost/mpl/bool.hpp>
|
31
|
+
#include <boost/mpl/bool_fwd.hpp>
|
32
|
+
#include <boost/mpl/char.hpp>
|
33
|
+
#include <boost/mpl/char_fwd.hpp>
|
34
|
+
#include <boost/mpl/clear.hpp>
|
35
|
+
#include <boost/mpl/clear_fwd.hpp>
|
36
|
+
#include <boost/mpl/comparison.hpp>
|
37
|
+
#include <boost/mpl/contains.hpp>
|
38
|
+
#include <boost/mpl/contains_fwd.hpp>
|
39
|
+
#include <boost/mpl/copy.hpp>
|
40
|
+
#include <boost/mpl/copy_if.hpp>
|
41
|
+
#include <boost/mpl/count.hpp>
|
42
|
+
#include <boost/mpl/count_fwd.hpp>
|
43
|
+
#include <boost/mpl/count_if.hpp>
|
44
|
+
#include <boost/mpl/deque.hpp>
|
45
|
+
#include <boost/mpl/deref.hpp>
|
46
|
+
#include <boost/mpl/distance.hpp>
|
47
|
+
#include <boost/mpl/distance_fwd.hpp>
|
48
|
+
#include <boost/mpl/divides.hpp>
|
49
|
+
#include <boost/mpl/empty.hpp>
|
50
|
+
#include <boost/mpl/empty_base.hpp>
|
51
|
+
#include <boost/mpl/empty_fwd.hpp>
|
52
|
+
#include <boost/mpl/empty_sequence.hpp>
|
53
|
+
#include <boost/mpl/end.hpp>
|
54
|
+
#include <boost/mpl/equal.hpp>
|
55
|
+
#include <boost/mpl/equal_to.hpp>
|
56
|
+
#include <boost/mpl/erase.hpp>
|
57
|
+
#include <boost/mpl/erase_fwd.hpp>
|
58
|
+
#include <boost/mpl/erase_key.hpp>
|
59
|
+
#include <boost/mpl/erase_key_fwd.hpp>
|
60
|
+
#include <boost/mpl/eval_if.hpp>
|
61
|
+
#include <boost/mpl/filter_view.hpp>
|
62
|
+
#include <boost/mpl/find.hpp>
|
63
|
+
#include <boost/mpl/find_if.hpp>
|
64
|
+
#include <boost/mpl/fold.hpp>
|
65
|
+
#include <boost/mpl/for_each.hpp>
|
66
|
+
#include <boost/mpl/front.hpp>
|
67
|
+
#include <boost/mpl/front_fwd.hpp>
|
68
|
+
#include <boost/mpl/front_inserter.hpp>
|
69
|
+
#include <boost/mpl/greater.hpp>
|
70
|
+
#include <boost/mpl/greater_equal.hpp>
|
71
|
+
#include <boost/mpl/has_key.hpp>
|
72
|
+
#include <boost/mpl/has_key_fwd.hpp>
|
73
|
+
#include <boost/mpl/has_xxx.hpp>
|
74
|
+
#include <boost/mpl/identity.hpp>
|
75
|
+
#include <boost/mpl/if.hpp>
|
76
|
+
#include <boost/mpl/index_if.hpp>
|
77
|
+
#include <boost/mpl/index_of.hpp>
|
78
|
+
#include <boost/mpl/inherit.hpp>
|
79
|
+
#include <boost/mpl/inherit_linearly.hpp>
|
80
|
+
#include <boost/mpl/insert.hpp>
|
81
|
+
#include <boost/mpl/insert_fwd.hpp>
|
82
|
+
#include <boost/mpl/insert_range.hpp>
|
83
|
+
#include <boost/mpl/insert_range_fwd.hpp>
|
84
|
+
#include <boost/mpl/inserter.hpp>
|
85
|
+
#include <boost/mpl/int.hpp>
|
86
|
+
#include <boost/mpl/int_fwd.hpp>
|
87
|
+
#include <boost/mpl/integral_c.hpp>
|
88
|
+
#include <boost/mpl/integral_c_fwd.hpp>
|
89
|
+
#include <boost/mpl/integral_c_tag.hpp>
|
90
|
+
#include <boost/mpl/is_placeholder.hpp>
|
91
|
+
#include <boost/mpl/is_sequence.hpp>
|
92
|
+
#include <boost/mpl/iter_fold.hpp>
|
93
|
+
#include <boost/mpl/iter_fold_if.hpp>
|
94
|
+
#include <boost/mpl/iterator_category.hpp>
|
95
|
+
#include <boost/mpl/iterator_range.hpp>
|
96
|
+
#include <boost/mpl/iterator_tags.hpp>
|
97
|
+
#include <boost/mpl/joint_view.hpp>
|
98
|
+
#include <boost/mpl/key_type.hpp>
|
99
|
+
#include <boost/mpl/key_type_fwd.hpp>
|
100
|
+
#include <boost/mpl/lambda.hpp>
|
101
|
+
#include <boost/mpl/lambda_fwd.hpp>
|
102
|
+
#include <boost/mpl/less.hpp>
|
103
|
+
#include <boost/mpl/less_equal.hpp>
|
104
|
+
#include <boost/mpl/list.hpp>
|
105
|
+
#include <boost/mpl/list_c.hpp>
|
106
|
+
#include <boost/mpl/logical.hpp>
|
107
|
+
#include <boost/mpl/long.hpp>
|
108
|
+
#include <boost/mpl/long_fwd.hpp>
|
109
|
+
#include <boost/mpl/lower_bound.hpp>
|
110
|
+
#include <boost/mpl/map.hpp>
|
111
|
+
#include <boost/mpl/max.hpp>
|
112
|
+
#include <boost/mpl/max_element.hpp>
|
113
|
+
#include <boost/mpl/min.hpp>
|
114
|
+
#include <boost/mpl/min_element.hpp>
|
115
|
+
#include <boost/mpl/min_max.hpp>
|
116
|
+
#include <boost/mpl/minus.hpp>
|
117
|
+
#include <boost/mpl/modulus.hpp>
|
118
|
+
#include <boost/mpl/multiplies.hpp>
|
119
|
+
#include <boost/mpl/negate.hpp>
|
120
|
+
#include <boost/mpl/next.hpp>
|
121
|
+
#include <boost/mpl/next_prior.hpp>
|
122
|
+
#include <boost/mpl/not.hpp>
|
123
|
+
#include <boost/mpl/not_equal_to.hpp>
|
124
|
+
#include <boost/mpl/numeric_cast.hpp>
|
125
|
+
#include <boost/mpl/O1_size.hpp>
|
126
|
+
#include <boost/mpl/O1_size_fwd.hpp>
|
127
|
+
#include <boost/mpl/or.hpp>
|
128
|
+
#include <boost/mpl/order.hpp>
|
129
|
+
#include <boost/mpl/order_fwd.hpp>
|
130
|
+
#include <boost/mpl/pair.hpp>
|
131
|
+
#include <boost/mpl/pair_view.hpp>
|
132
|
+
#include <boost/mpl/partition.hpp>
|
133
|
+
#include <boost/mpl/placeholders.hpp>
|
134
|
+
#include <boost/mpl/plus.hpp>
|
135
|
+
#include <boost/mpl/pop_back.hpp>
|
136
|
+
#include <boost/mpl/pop_back_fwd.hpp>
|
137
|
+
#include <boost/mpl/pop_front.hpp>
|
138
|
+
#include <boost/mpl/pop_front_fwd.hpp>
|
139
|
+
#include <boost/mpl/print.hpp>
|
140
|
+
#include <boost/mpl/prior.hpp>
|
141
|
+
#include <boost/mpl/protect.hpp>
|
142
|
+
#include <boost/mpl/push_back.hpp>
|
143
|
+
#include <boost/mpl/push_back_fwd.hpp>
|
144
|
+
#include <boost/mpl/push_front.hpp>
|
145
|
+
#include <boost/mpl/push_front_fwd.hpp>
|
146
|
+
#include <boost/mpl/quote.hpp>
|
147
|
+
#include <boost/mpl/range_c.hpp>
|
148
|
+
#include <boost/mpl/remove.hpp>
|
149
|
+
#include <boost/mpl/remove_if.hpp>
|
150
|
+
#include <boost/mpl/replace.hpp>
|
151
|
+
#include <boost/mpl/replace_if.hpp>
|
152
|
+
#include <boost/mpl/reverse.hpp>
|
153
|
+
#include <boost/mpl/reverse_fold.hpp>
|
154
|
+
#include <boost/mpl/reverse_iter_fold.hpp>
|
155
|
+
#include <boost/mpl/same_as.hpp>
|
156
|
+
#include <boost/mpl/sequence_tag.hpp>
|
157
|
+
#include <boost/mpl/sequence_tag_fwd.hpp>
|
158
|
+
#include <boost/mpl/set.hpp>
|
159
|
+
#include <boost/mpl/set_c.hpp>
|
160
|
+
#include <boost/mpl/shift_left.hpp>
|
161
|
+
#include <boost/mpl/shift_right.hpp>
|
162
|
+
#include <boost/mpl/single_view.hpp>
|
163
|
+
#include <boost/mpl/size.hpp>
|
164
|
+
#include <boost/mpl/size_fwd.hpp>
|
165
|
+
#include <boost/mpl/size_t.hpp>
|
166
|
+
#include <boost/mpl/size_t_fwd.hpp>
|
167
|
+
#include <boost/mpl/sizeof.hpp>
|
168
|
+
#include <boost/mpl/sort.hpp>
|
169
|
+
#include <boost/mpl/stable_partition.hpp>
|
170
|
+
#include <boost/mpl/string.hpp>
|
171
|
+
#include <boost/mpl/switch.hpp>
|
172
|
+
#include <boost/mpl/tag.hpp>
|
173
|
+
#include <boost/mpl/times.hpp>
|
174
|
+
#include <boost/mpl/transform.hpp>
|
175
|
+
#include <boost/mpl/transform_view.hpp>
|
176
|
+
#include <boost/mpl/unique.hpp>
|
177
|
+
#include <boost/mpl/unpack_args.hpp>
|
178
|
+
#include <boost/mpl/upper_bound.hpp>
|
179
|
+
#include <boost/mpl/value_type.hpp>
|
180
|
+
#include <boost/mpl/value_type_fwd.hpp>
|
181
|
+
#include <boost/mpl/vector.hpp>
|
182
|
+
#include <boost/mpl/vector_c.hpp>
|
183
|
+
#include <boost/mpl/void.hpp>
|
184
|
+
#include <boost/mpl/void_fwd.hpp>
|
185
|
+
#include <boost/mpl/zip_view.hpp>
|
@@ -0,0 +1 @@
|
|
1
|
+
#include <boost/mpl11.hpp>
|
@@ -0,0 +1 @@
|
|
1
|
+
#include <boost/mpl11.min.hpp>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
#include <boost/mpl11/integer.hpp>
|
2
|
+
|
3
|
+
|
4
|
+
using size_t = decltype(sizeof(int));
|
5
|
+
|
6
|
+
constexpr struct plus_ {
|
7
|
+
template <typename X, typename Y>
|
8
|
+
constexpr auto operator()(X x, Y y) { return x + y; }
|
9
|
+
} plus{};
|
10
|
+
|
11
|
+
template <typename T, size_t N, typename F, typename State>
|
12
|
+
constexpr State homogeneous_foldl(F f, State s, const T (&array)[N]) {
|
13
|
+
for (size_t i = 0; i < N; ++i)
|
14
|
+
s = f(s, array[i]);
|
15
|
+
return s;
|
16
|
+
}
|
17
|
+
|
18
|
+
template <typename ...xs>
|
19
|
+
using sum = boost::mpl11::integer_c<
|
20
|
+
decltype(homogeneous_foldl<size_t, sizeof...(xs)>(plus, 0, {xs::value...})),
|
21
|
+
homogeneous_foldl<size_t, sizeof...(xs)>(plus, 0, {xs::value...})
|
22
|
+
>;
|
23
|
+
|
24
|
+
<%= render('_main.erb') %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
#include <boost/mpl11/detail/left_folds/variadic.hpp>
|
2
|
+
#include <boost/mpl11/integer.hpp>
|
3
|
+
|
4
|
+
|
5
|
+
template <typename x, typename y>
|
6
|
+
using plus = boost::mpl11::integer_c<
|
7
|
+
decltype(x::type::value + y::type::value),
|
8
|
+
x::type::value + y::type::value
|
9
|
+
>;
|
10
|
+
|
11
|
+
template <typename ...xs>
|
12
|
+
using sum = boost::mpl11::detail::left_folds::variadic<
|
13
|
+
plus, boost::mpl11::int_<0>, xs...
|
14
|
+
>;
|
15
|
+
|
16
|
+
<%= render('_main.erb') %>
|
@@ -0,0 +1,18 @@
|
|
1
|
+
template <typename ...>
|
2
|
+
struct result { using type = result; };
|
3
|
+
|
4
|
+
struct f {
|
5
|
+
using type = f;
|
6
|
+
template <typename state, typename x>
|
7
|
+
using apply = typename result<typename state::type, typename x::type>::type;
|
8
|
+
};
|
9
|
+
|
10
|
+
|
11
|
+
<%= (0...breadth).map { |breadth|
|
12
|
+
xs = (0...depth).map { |depth| "x#{breadth}<#{depth}>" }
|
13
|
+
<<-EOS
|
14
|
+
struct state#{breadth} { using type = state#{breadth}; };
|
15
|
+
template <int> struct x#{breadth} { using type = x#{breadth}; };
|
16
|
+
using go#{breadth} = #{yield 'f', "state#{breadth}", xs};
|
17
|
+
EOS
|
18
|
+
}.join("\n") %>
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#include <boost/hana/list.hpp>
|
2
|
+
#include <boost/hana/type.hpp>
|
3
|
+
|
4
|
+
|
5
|
+
<%= render('_main.erb') do |f, state, xs|
|
6
|
+
<<-EOS
|
7
|
+
decltype(
|
8
|
+
boost::hana::foldl(
|
9
|
+
boost::hana::lift<#{f}::apply>,
|
10
|
+
boost::hana::type<#{state}>,
|
11
|
+
boost::hana::list_t<#{xs.join(', ')}>
|
12
|
+
)
|
13
|
+
)::type
|
14
|
+
EOS
|
15
|
+
end %>
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#define BOOST_MPL11_NO_ASSERTIONS
|
2
|
+
#include <boost/mpl11/list.hpp>
|
3
|
+
|
4
|
+
|
5
|
+
<%= render('_main.erb') do |f, state, xs|
|
6
|
+
cons = xs.foldr("boost::mpl11::list<>") { |x, tail|
|
7
|
+
"boost::mpl11::cons<#{x}, #{tail}>"
|
8
|
+
}
|
9
|
+
"boost::mpl11::foldl<#{f}, #{state}, #{cons}>::type"
|
10
|
+
end %>
|