| // { dg-do compile { target *-*-linux* } } |
| // { dg-options "-O3 -std=c++20 -ftrivial-auto-var-init=zero -march=x86-64-v3 -fPIC -w -mtls-dialect=gnu " } |
| |
| template <int> using b = int; |
| template <typename, typename> struct e; |
| struct m {}; |
| template <class> struct aa; |
| template <typename> struct j; |
| using h = aa<j<int>>; |
| template <typename> using a = h; |
| template <typename> using k = h; |
| template <typename d> struct p { |
| d ad; |
| }; |
| struct ac {}; |
| template <typename> struct al; |
| template <typename g> struct al<g *> { |
| typedef g &ah; |
| }; |
| template <typename z> z ::i q(z); |
| struct w { |
| e<m, m> *l; |
| al<e<m, m> *>::ah operator*() { return *l; } |
| bool operator==(w) { return l; } |
| }; |
| template <typename g, int o> struct n { |
| using af = g[o]; |
| }; |
| template <typename g, int o> struct ak { |
| n<g, o>::af am; |
| }; |
| void ab(); |
| template <typename ai> void ar(ai r, ac) { |
| ai ag; |
| for (; r != ag; ++r) |
| ab(), *r; |
| } |
| template <typename ai> void as(ai r, ac) { ar(r, q(r)); } |
| struct { |
| template <typename ai> void aj(ai r, ai) { as(r, q(r)); } |
| } ao; |
| namespace ap { |
| template <int at> struct bb { |
| static const bool ax = at; |
| }; |
| } // namespace ap |
| using ap::bb; |
| namespace av { |
| template <class aq, aq> struct c; |
| template <bool au> struct c<bool, au> { |
| static const bool ax = au; |
| operator bb<au>() { |
| void *bc; |
| return *reinterpret_cast<bb<au> *>(bc); |
| } |
| }; |
| template <class, class> struct ae : c<bool, false> {}; |
| template <class aq> struct ae<aq, aq> : c<bool, true> {}; |
| namespace aw { |
| using namespace ap; |
| } |
| } // namespace av |
| namespace ap { |
| template <int> struct bd { |
| typedef bd<1> bh; |
| }; |
| } // namespace ap |
| namespace av { |
| namespace aw { |
| template <typename, typename = int> struct be; |
| template <int, typename, typename, typename, typename> struct bn : bb<true> {}; |
| template <typename bg, typename bj, typename ay, typename az> |
| struct bn<false, bg, bj, ay, az> : bn<bg ::ax, bj, ay, az, bb<false>> {}; |
| template <> |
| struct bn<false, bb<false>, bb<false>, bb<false>, bb<false>> : bb<false> {}; |
| template <typename bg, typename bj = int, typename ay = bb<false>, |
| typename az = bb<false>, typename bl = bb<false>> |
| struct br : bn<bg ::ax, bj, ay, az, bl> {}; |
| } // namespace aw |
| template <class aq> struct bi { |
| typedef aq h; |
| }; |
| template <typename aq> bi<aq>::h bf(); |
| template <class> struct ba : c<bool, false> {}; |
| template <class aq> struct ba<aq const> : c<bool, true> {}; |
| template <class aq> struct bk { |
| typedef aq const h; |
| }; |
| template <class aq> struct bq { |
| typedef aq h; |
| }; |
| template <class aq> struct bu { |
| typedef aq::h h; |
| }; |
| template <class bo> struct by { |
| typedef bo ::ah h; |
| }; |
| template <class aq> struct bm { |
| typedef aq h; |
| }; |
| template <class aq> struct bm<aq const> { |
| typedef aq h; |
| }; |
| namespace aw { |
| template <int, typename bg, typename> struct bp { |
| typedef bg h; |
| }; |
| template <typename bg, typename bj> struct bp<false, bg, bj> { |
| typedef bj h; |
| }; |
| template <typename bg, typename bj, typename ay = int> struct cg { |
| typedef bp<bg::ax, bj, ay>::h h; |
| }; |
| template <typename C, typename bt, typename cd = int> struct bs { |
| typedef cg<C, bt, cd>::h ::h h; |
| }; |
| template <int, typename, typename, typename, typename> struct bx; |
| template <typename bg, typename bj, typename ay, typename az> |
| struct bx<true, bg, bj, ay, az> : bx<bg ::ax, bj, ay, az, bb<true>> {}; |
| template <> |
| struct bx<true, bb<true>, bb<true>, bb<true>, bb<true>> : bb<true> {}; |
| template <typename bg, typename bj> |
| struct bw : bx<bg ::ax, bj, bb<true>, bb<true>, bb<true>> {}; |
| } // namespace aw |
| template <typename bv, typename bz> struct cb { |
| template <typename cc> static void ca(cc); |
| template <typename ch, typename cc> static decltype(ca<cc>(bf<ch>())) cr(int); |
| template <typename, typename> static int cr(...); |
| static const bool ax = sizeof(cr<bv, bz>(0)) == 1; |
| }; |
| template <typename bv, typename bz> struct cm { |
| static const bool ax = cb<bv, bz>::ax; |
| }; |
| template <class bv, class bz> struct cl { |
| typedef cm<bv, bz> h; |
| }; |
| template <typename bv, typename bz> struct ci { |
| typedef cl<bv, bz>::h h; |
| }; |
| template <typename bv, typename bz> struct co : ci<bv, bz>::h {}; |
| template <class bv, class bz> struct ce : c<bool, co<bv, bz>::ax> {}; |
| namespace aw { |
| template <typename aq> struct cf { |
| typedef aq h; |
| }; |
| } // namespace aw |
| template <int> struct arg { |
| template <typename ck, typename> struct apply { |
| typedef ck h; |
| }; |
| }; |
| template <> struct arg<2> { |
| template <typename, typename cu> struct apply { |
| typedef cu h; |
| }; |
| }; |
| struct cj {}; |
| template <class cq> struct cx : aw::bs<ce<cq, cj>, aw::cf<cq>> {}; |
| template <class bo> struct cw : cx<typename bo::i> {}; |
| template <class ct, class cp, class dc> |
| struct cn : aw::bs<aw::bw<ce<ct, cj>, ce<dc, cp>>, aw::cf<ac>> {}; |
| template <class aq> struct dd : aw::br<ce<aq, ac>, ce<aq, int>> {}; |
| template <class cs, class ct> struct cz : cs, ct {}; |
| template <class cp, class dc> struct da { |
| typedef cn<cj, cp, dc>::h category; |
| typedef aw::cg<ae<cj, int>, category, cz<category, cj>>::h h; |
| }; |
| template <class cy, class cp, class dc> |
| struct s : aw::bs<dd<cy>, aw::cf<cy>, da<cp, dc>> {}; |
| namespace aw { |
| template <typename df, typename bg> struct de : df::apply<bg> {}; |
| template <typename df, typename bg, typename bj> |
| struct u : df::apply<bg, bj> {}; |
| template <typename df, typename bg, typename bj> |
| struct db : df::apply<bg, bj> {}; |
| template <typename aq> struct bh { |
| typedef aq::bh h; |
| }; |
| template <typename, typename, typename, typename> struct cv; |
| template <int dk, typename ck, typename cu, typename dm> |
| struct cv<arg<dk>, ck, cu, dm> { |
| typedef db<arg<dk>, ck, cu>::h h; |
| }; |
| template <typename df, typename bg> struct dh { |
| template <typename ck, typename cu = int> struct apply { |
| typedef de<df, typename cv<bg, ck, cu, int>::h>::h h; |
| }; |
| }; |
| template <typename df, typename bg, typename ck, typename cu, typename dm> |
| struct cv<dh<df, bg>, ck, cu, dm> { |
| typedef db<dh<df, bg>, ck, cu>::h h; |
| }; |
| template <typename df, typename bg, typename bj> struct dg { |
| template <typename ck, typename cu> struct apply { |
| typedef u<df, typename cv<bg, ck, cu, int>::h, |
| typename cv<bj, ck, cu, int>::h>::h h; |
| }; |
| }; |
| template <typename aq> struct di { |
| typedef aq::h h; |
| }; |
| template <template <typename> class df> struct dl { |
| template <typename ck> struct apply : di<df<ck>> {}; |
| }; |
| template <int dk, typename dn> struct be<arg<dk>, dn> { |
| typedef bb<true> dj; |
| typedef arg<dk> result_; |
| }; |
| template <typename, template <typename> class, typename> struct x; |
| template <template <typename> class df, typename L1> |
| struct x<bb<true>, df, L1> { |
| typedef dh<dl<df>, typename L1::result_> h; |
| }; |
| template <template <typename> class df, typename bg, typename dn> |
| struct be<df<bg>, dn> { |
| typedef be<bg> l1; |
| typedef x<typename l1::dj, df, l1>::h h; |
| }; |
| template <typename df, typename bg, typename bj> |
| struct apply2 : u<df, bg, bj> {}; |
| } // namespace aw |
| namespace iterators { |
| struct always_bool2 { |
| template <class, class> struct apply { |
| typedef bool h; |
| }; |
| }; |
| template <class cp, class cy, class dc> struct y { |
| typedef s<cy, cp, dc>::h i; |
| }; |
| template <class, class, class, class, class, bool> class iterator_facade_base; |
| struct iterator_core_access { |
| template <class Facade> static Facade::ah dereference(Facade &r) { |
| return r.dereference(); |
| } |
| template <class Facade> static void increment(Facade &r) { r.increment(); } |
| template <class Facade1, class Facade2> |
| static bool equal(Facade1 &r, Facade2 p2) { |
| return r.equal(p2); |
| } |
| }; |
| template <class Derived, class Value, class cy, class dc, class Difference> |
| struct iterator_facade_base<Derived, Value, cy, dc, Difference, false> { |
| typedef dc ah; |
| typedef y<Value, cy, dc>::i i; |
| ah operator*() { return iterator_core_access::dereference(derived()); } |
| void operator++() { iterator_core_access::increment(derived()); } |
| Derived &derived() { return *static_cast<Derived *>(this); } |
| }; |
| template <class Derived, class Value, class cy, class dc, class = long> |
| struct iterator_facade |
| : iterator_facade_base<Derived, Value, cy, dc, int, ce<cj, int>::ax> {}; |
| template <class Derived1, class V1, class TC1, class Reference1, |
| class Difference1, class Derived2, class V2, class TC2, |
| class Reference2, class Difference2> |
| bq<typename aw::apply2<always_bool2, Derived1, Derived2>::h>::h |
| operator==(iterator_facade<Derived1, V1, TC1, Reference1, Difference1> const &r, |
| iterator_facade<Derived2, V2, TC2, Reference2, Difference2> p2) { |
| return iterator_core_access::equal(*static_cast<Derived1 const *>(&r), |
| *static_cast<Derived2 *>(&p2)); |
| } |
| } // namespace iterators |
| using iterators::iterator_facade; |
| template <class aq, class DefaultNullaryFn> |
| struct ia_dflt_help : aw::bs<ae<aq, int>, DefaultNullaryFn, aw::cf<aq>> {}; |
| template <class Derived, class Base, class dc> struct iterator_adaptor_base { |
| typedef iterator_facade<Derived, int, typename ia_dflt_help<int, cw<Base>>::h, |
| typename ia_dflt_help<dc, int>::h> |
| h; |
| }; |
| template <class Derived, class Base, class, class, class dc, class = int> |
| struct iterator_adaptor : iterator_adaptor_base<Derived, Base, dc>::h { |
| Base an() const { return m_iterator; } |
| template <class OtherDerived, class OtherIterator, class V, class C, class R, |
| class D> |
| bool equal(iterator_adaptor<OtherDerived, OtherIterator, V, C, R, D>) const { |
| return m_iterator == an(); |
| } |
| void increment() { ++m_iterator; } |
| Base m_iterator; |
| }; |
| template <typename> struct result_of; |
| template <typename df, typename... Args> struct result_of<df(Args...)> { |
| typedef decltype(df()(bf<Args>()...)) h; |
| }; |
| namespace iterators { |
| template <class> class transform_iterator; |
| template <class UnaryFunc, class bo> struct transform_iterator_base { |
| typedef iterator_adaptor< |
| transform_iterator<UnaryFunc>, bo, UnaryFunc, int, |
| typename ia_dflt_help<int, result_of<UnaryFunc(typename bo::ah)>>::h> |
| h; |
| }; |
| template <typename> class zip_iterator; |
| template <class UnaryFunc> |
| struct transform_iterator |
| : transform_iterator_base<UnaryFunc, zip_iterator<int>>::h { |
| void dereference() { m_f(*this->an()); } |
| UnaryFunc m_f; |
| }; |
| template <class UnaryFunc> |
| transform_iterator<UnaryFunc> make_transform_iterator(zip_iterator<int>, |
| UnaryFunc); |
| } // namespace iterators |
| namespace tuples { |
| template <class, class> struct cons; |
| template <class = int, class = int, class = int, class = int, class = int, |
| class = int, class = int, class = int, class = int, class = int> |
| class tuple; |
| template <class aq> struct access_traits { |
| typedef const aq &const_type; |
| typedef aq &non_const_type; |
| }; |
| template <long, class HT, class TT> |
| access_traits<HT>::const_type get(cons<HT, TT>); |
| template <class aq> struct wrap_non_storeable_type { |
| typedef aq h; |
| }; |
| template <class HT, class TT> struct cons { |
| typedef HT head_type; |
| typedef TT tail_type; |
| typedef wrap_non_storeable_type<head_type>::h stored_head_type; |
| stored_head_type head; |
| tail_type tail; |
| access_traits<stored_head_type>::non_const_type get_head() { return head; } |
| access_traits<tail_type>::non_const_type get_tail() { return tail; } |
| access_traits<stored_head_type>::const_type get_head() const { return head; } |
| access_traits<tail_type>::const_type get_tail() const { return tail; } |
| }; |
| template <class T0, class bg, class, class, class, class, class, class, class, |
| class> |
| struct map_tuple_to_cons { |
| typedef cons<T0, typename map_tuple_to_cons<bg, int, int, int, int, int, int, |
| int, int, int>::h> |
| h; |
| }; |
| template <> |
| struct map_tuple_to_cons<int, int, int, int, int, int, int, int, int, int> { |
| typedef int h; |
| }; |
| template <class T0, class bg, class, class, class, class, class, class, class, |
| class> |
| struct tuple |
| : map_tuple_to_cons<T0, bg, int, int, int, int, int, int, int, int>::h {}; |
| } // namespace tuples |
| using tuples::tuple; |
| } // namespace av |
| template <class R_> struct aa { |
| ak<typename R_::FT, 3> an; |
| }; |
| template <typename K> struct Compare_xy_2 { |
| typedef K::Point_2 Point_2; |
| void operator()(Point_2, Point_2); |
| }; |
| template <typename K_, typename FT_> struct Cartesian_base { |
| typedef FT_ FT; |
| typedef m Point_2; |
| typedef aa<K_> Line_2; |
| }; |
| template <typename K_base> struct Type_equality_wrapper : K_base {}; |
| template <typename FT_, typename Kernel_> |
| struct Cartesian_base_no_ref_count : Cartesian_base<Kernel_, FT_> {}; |
| template <typename FT_> |
| struct j : Type_equality_wrapper<Cartesian_base_no_ref_count<FT_, j<FT_>>> {}; |
| template <class C2E> struct Filtered_predicate { |
| C2E c2e; |
| Compare_xy_2<j<double>> ep; |
| template <typename... Args> void operator()(Args... r) { ep(c2e(r)...); } |
| }; |
| struct Mpzf { |
| ~Mpzf(); |
| }; |
| struct Cartesian_converter { |
| j<Mpzf>::Line_2 operator()(Type_equality_wrapper<j<double>>::Line_2); |
| }; |
| namespace av { |
| namespace aw { |
| template <typename> struct begin_impl; |
| template <typename> struct end_impl; |
| template <typename> struct sequence_tag; |
| template <typename Sequence> struct begin { |
| typedef sequence_tag<Sequence>::h tag_; |
| typedef begin_impl<tag_>::template apply<Sequence>::h h; |
| }; |
| template <typename Sequence> struct ab { |
| typedef sequence_tag<Sequence>::h tag_; |
| typedef end_impl<tag_>::template apply<Sequence>::h h; |
| }; |
| const long ax = -1; |
| template <int, typename, typename, typename, typename> struct fold_impl; |
| template <typename First, typename Last, typename State, typename ForwardOp> |
| struct fold_impl<-1, First, Last, State, ForwardOp> |
| : fold_impl<-1, typename bh<First>::h, Last, |
| typename apply2<ForwardOp, State, typename First::h>::h, |
| ForwardOp> {}; |
| template <typename Last, typename State, typename ForwardOp> |
| struct fold_impl<-1, Last, Last, State, ForwardOp> { |
| typedef State state; |
| }; |
| template <typename Sequence, typename State, typename ForwardOp> struct fold { |
| typedef fold_impl<ax, typename begin<Sequence>::h, typename ab<Sequence>::h, |
| State, ForwardOp>::state h; |
| }; |
| template <typename> struct push_back_impl; |
| template <typename Sequence = int, typename aq = int> |
| struct push_back |
| : push_back_impl<typename sequence_tag<Sequence>::h>::apply<Sequence, aq> { |
| }; |
| struct has_push_back { |
| static const bool ax = sizeof(0); |
| }; |
| template <> struct push_back<> { |
| template <typename bg, typename bj> struct apply : push_back<bg, bj> {}; |
| }; |
| template <typename Sequence, typename Operation> struct inserter { |
| typedef Sequence state; |
| typedef Operation operation; |
| }; |
| template <typename Sequence> |
| struct back_inserter : inserter<Sequence, push_back<>> {}; |
| template <typename> struct clear_impl; |
| template <typename Sequence> |
| struct clear : clear_impl<typename sequence_tag<Sequence>::h>::apply<Sequence> { |
| }; |
| template <typename Seq, typename Op, typename In> |
| struct transform1_impl |
| : fold<Seq, typename In::state, |
| dg<typename In::operation, arg<1>, dh<typename be<Op>::h, arg<2>>>> { |
| }; |
| template <typename P1> |
| struct transform1 |
| : cg<has_push_back, |
| transform1_impl<P1, by<arg<1>>, |
| back_inserter<typename clear<P1>::h>>>::h {}; |
| template <typename Seq1> struct transform { |
| typedef bs<br<bb<true>>, transform1<Seq1>>::h h; |
| }; |
| } // namespace aw |
| } // namespace av |
| template <typename, typename, typename> struct Type_mapper_impl; |
| template <typename K1, typename K2> |
| struct Type_mapper_impl<typename K1::Line_2, K1, K2> { |
| typedef K2::Line_2 h; |
| }; |
| auto call_once___callable = [] {}; |
| struct once_flag { |
| struct _Prepare_execution; |
| } __thread *__once_callable; |
| struct once_flag::_Prepare_execution { |
| template <typename _Callable> _Prepare_execution(_Callable) { |
| __once_callable = nullptr; |
| } |
| }; |
| template <typename _Callable> void call_once(_Callable) { |
| once_flag::_Prepare_execution __exec(call_once___callable); |
| } |
| template <typename ET> auto approx(e<aa<j<int>>, ET> r) { return r.approx(); } |
| template <typename ET> ET exact(e<m, ET> r) { return r.exact(); } |
| once_flag once; |
| template <typename AT_, typename ET> struct Lazy_rep { |
| AT_ approx(); |
| ET exact_unsafe(); |
| ET exact() { |
| call_once(once); |
| return exact_unsafe(); |
| } |
| }; |
| struct Exact_converter { |
| template <typename aq> auto operator()(aq r) { return exact(r); } |
| }; |
| template <typename AT_, typename ET_> struct e { |
| typedef Lazy_rep<AT_, ET_> Self_rep; |
| e(Self_rep *); |
| auto approx() { return ptr()->approx(); } |
| ET_ exact() { return ptr()->exact(); } |
| Self_rep *ptr(); |
| }; |
| template <typename LK> struct Lazy_construction { |
| auto operator()() { |
| return typename Type_mapper_impl<a<k<int>>, typename LK::Approximate_kernel, |
| LK>::h(0); |
| } |
| }; |
| template <typename, typename> |
| using Epick_with_filtered_predicates = Type_equality_wrapper<j<double>>; |
| struct Epic_converter { |
| p<Epick_with_filtered_predicates<double, int>::Line_2> |
| operator()(j<int>::Line_2); |
| }; |
| template <typename FP, typename EpicP> struct Static_filtered_predicate { |
| FP fp; |
| EpicP epicp; |
| template <typename A1> void operator()(A1 r) { |
| Epic_converter convert; |
| auto __trans_tmp_4 = approx(r), aa1 = convert(__trans_tmp_4); |
| epicp(aa1.ad); |
| } |
| template <typename A1, typename A2> void operator()(A1 r, A2 p2) { |
| fp(r, p2); |
| } |
| }; |
| Static_filtered_predicate<Filtered_predicate<Exact_converter>, int> |
| compare_xy_2_object(); |
| Static_filtered_predicate<int, Cartesian_converter> is_vertical_2_object(); |
| struct Lazy_kernel_base { |
| typedef j<int> Approximate_kernel; |
| typedef e<Approximate_kernel::Line_2, int> Line_2; |
| }; |
| template <typename, typename> using Epeck_lazy_base = Lazy_kernel_base; |
| template <typename FT, typename> |
| using Epeck_lazy_base_with_type_equality = |
| Type_equality_wrapper<Epeck_lazy_base<FT, class Epeck>>; |
| struct Epeck : Epeck_lazy_base_with_type_equality<double, Epeck> {}; |
| struct Construct_x_monotone_curve_2 { |
| void operator()(e<m, m> r, e<m, m> p2) { |
| Lazy_construction<Epeck> __trans_tmp_9; |
| auto line = __trans_tmp_9(); |
| compare_xy_2_object()(r, p2); |
| is_vertical_2_object()(line); |
| } |
| }; |
| Construct_x_monotone_curve_2 construct_curve_2_object(); |
| namespace av { |
| w last1; |
| typedef e<m, m> *iterator2_t; |
| struct join_iterator_union { |
| iterator2_t &it2() { return m_it2; } |
| e<m, m> &dereference(unsigned r) { |
| if (r) |
| return *m_it2; |
| return *m_it1; |
| } |
| w m_it1; |
| iterator2_t m_it2; |
| }; |
| struct join_iterator : iterator_facade<join_iterator, int, int, e<m, m> &> { |
| w __trans_tmp_24; |
| void increment() { |
| if (m_section) |
| ; |
| else if (__trans_tmp_24 == last1) |
| m_it.it2() = 0; |
| } |
| ah dereference() { return m_it.dereference(m_section); } |
| bool equal(join_iterator) const { return m_section; } |
| int m_section; |
| join_iterator_union m_it; |
| }; |
| } // namespace av |
| template <typename InputIterator> void construct_polycurve(InputIterator r) { |
| InputIterator begin; |
| ao.aj(begin, r); |
| } |
| struct Polycurve_2 { |
| template <typename InputIterator> |
| Polycurve_2(InputIterator, InputIterator p2) { |
| construct_polycurve(p2); |
| } |
| }; |
| struct Arr_polycurve_traits_2 { |
| struct Construct_curve_2 { |
| template <typename ForwardIterator> |
| void operator()(ForwardIterator r, ForwardIterator p2) { |
| Polycurve_2(r, p2); |
| } |
| }; |
| }; |
| namespace av { |
| namespace fusion { |
| namespace traits { |
| template <typename> struct tag_of; |
| template <class T0, class bg, class bj, class ay, class az, class bl, class T6, |
| class T7, class T8, class T9> |
| struct tag_of<tuple<T0, bg, bj, ay, az, bl, T6, T7, T8, T9>> { |
| typedef int h; |
| }; |
| template <class Head, class Tail> struct tag_of<tuples::cons<Head, Tail>> { |
| typedef int h; |
| }; |
| } // namespace traits |
| } // namespace fusion |
| namespace aw { |
| template <class T0, class bg, class bj, class ay, class az, class bl, class T6, |
| class T7, class T8, class T9> |
| struct sequence_tag<tuple<T0, bg, bj, ay, az, bl, T6, T7, T8, T9>> { |
| typedef int h; |
| }; |
| template <class Head, class Tail> |
| struct sequence_tag<tuples::cons<Head, Tail>> { |
| typedef int h; |
| }; |
| } // namespace aw |
| namespace fusion { |
| namespace detail { |
| template <typename Sequence> struct tag_of_impl { |
| typedef Sequence::fusion_tag h; |
| }; |
| } // namespace detail |
| namespace traits { |
| template <typename Sequence> struct tag_of : detail::tag_of_impl<Sequence> {}; |
| } // namespace traits |
| namespace detail { |
| template <typename aq> struct tag_of : traits::tag_of<typename bm<aq>::h> {}; |
| } // namespace detail |
| struct iterator_facade_tag; |
| template <typename> struct next_impl { |
| template <typename bo> struct apply : bo::bh<bo> {}; |
| }; |
| namespace result_of { |
| template <typename bo> |
| struct bh : next_impl<typename bo::fusion_tag>::apply<bo> {}; |
| } // namespace result_of |
| template <typename bo> result_of::bh<bo>::h bh(bo r) { |
| return result_of::bh<bo>::call(r); |
| } |
| template <typename> struct equal_to_impl { |
| template <typename I1, typename I2> |
| struct apply : ae<typename bk<I1>::h, typename bk<I2>::h> {}; |
| }; |
| template <> struct equal_to_impl<iterator_facade_tag> { |
| template <typename, typename, typename, typename> struct dispatch; |
| template <typename It1, typename It2, typename dn> |
| struct dispatch<It1, It2, dn, dn> : It1::equal_to<It1, It2> {}; |
| template <typename It1, typename It2> |
| struct apply |
| : dispatch<It1, It2, typename It1::fusion_tag, typename It2::fusion_tag> { |
| }; |
| }; |
| namespace result_of { |
| template <typename I1, typename I2> |
| struct equal_to : equal_to_impl<typename I1::fusion_tag>::apply<I1, I2> {}; |
| } // namespace result_of |
| struct iterator_facade { |
| typedef iterator_facade_tag fusion_tag; |
| }; |
| template <typename Cons = int> struct boost_tuple_iterator : iterator_facade { |
| typedef Cons cons_type; |
| boost_tuple_iterator(Cons &r) : cons(r) {} |
| Cons &cons; |
| template <typename> |
| struct value_of : aw::cf<typename cons_type::head_type> {}; |
| template <typename bo> struct deref { |
| typedef value_of<bo>::h element; |
| typedef aw::cg< |
| ba<cons_type>, typename tuples::access_traits<element>::const_type, |
| typename tuples::access_traits<element>::non_const_type>::h h; |
| static h call(bo r) { return r.cons.get_head(); } |
| }; |
| template <typename bo> struct bh { |
| typedef cons_type::tail_type tail_type; |
| typedef boost_tuple_iterator< |
| typename aw::bs<ba<cons_type>, bk<tail_type>, aw::cf<tail_type>>::h> |
| h; |
| static h call(bo r) { return r.cons.get_tail(); } |
| }; |
| template <typename, typename I2> |
| struct equal_to : ae<Cons, typename I2::cf> {}; |
| }; |
| struct boost_tuple_null_iterator : iterator_facade { |
| typedef int cf; |
| template <typename, typename> struct equal_to : aw::br<ae<int, int>> {}; |
| }; |
| template <> struct boost_tuple_iterator<> : boost_tuple_null_iterator { |
| template <typename Cons> boost_tuple_iterator(Cons); |
| }; |
| template <> struct boost_tuple_iterator<int const> : boost_tuple_null_iterator { |
| template <typename Cons> boost_tuple_iterator(Cons) {} |
| }; |
| template <> struct boost_tuple_iterator<tuple<>> : boost_tuple_null_iterator {}; |
| template <typename> struct begin_impl { |
| template <typename Sequence> struct apply { |
| typedef boost_tuple_iterator<Sequence> h; |
| static h call(Sequence r) { return r; } |
| }; |
| }; |
| template <typename> struct end_impl { |
| template <typename Sequence> struct apply { |
| typedef boost_tuple_iterator<typename aw::cg<ba<Sequence>, int const>::h> h; |
| }; |
| }; |
| template <typename> struct value_of_impl { |
| template <typename bo> struct apply : bo::value_of<bo> {}; |
| }; |
| namespace result_of { |
| template <typename bo> |
| struct value_of : value_of_impl<typename bo::fusion_tag>::apply<bo> {}; |
| } // namespace result_of |
| template <typename> struct deref_impl { |
| template <typename bo> struct apply : bo::deref<bo> {}; |
| }; |
| namespace result_of { |
| template <typename bo> |
| struct deref : deref_impl<typename bo::fusion_tag>::apply<bo> {}; |
| } // namespace result_of |
| template <typename bo> result_of::deref<bo>::h deref(bo r) { |
| return result_of::deref<bo>::call(r); |
| } |
| template <typename bo> result_of::deref<bo>::h operator*(bo r) { |
| return deref(r); |
| } |
| namespace detail { |
| template <typename First, typename Last, |
| bool = result_of::equal_to<First, Last>::ax> |
| struct build_tuple_cons { |
| typedef int h; |
| static h call(First, Last) { return h(); } |
| }; |
| template <typename First, typename Last> |
| struct build_tuple_cons<First, Last, false> { |
| typedef build_tuple_cons<typename result_of::bh<First>::h, Last> |
| next_build_tuple_cons; |
| typedef tuples::cons<typename result_of::value_of<First>::h, |
| typename next_build_tuple_cons::h> |
| h; |
| static h call(First r, Last p2) { |
| typename result_of::value_of<First>::h v = *r; |
| return h(v, next_build_tuple_cons::call(bh(r), p2)); |
| } |
| }; |
| } // namespace detail |
| namespace result_of { |
| template <typename Sequence> |
| struct begin |
| : begin_impl<typename detail::tag_of<Sequence>::h>::apply<Sequence> {}; |
| template <typename Sequence> |
| struct ab : end_impl<typename detail::tag_of<Sequence>::h>::apply<Sequence> {}; |
| } // namespace result_of |
| namespace traits { |
| struct is_view : bb<0> {}; |
| } // namespace traits |
| } // namespace fusion |
| namespace aw { |
| template <typename bo> struct fusion_iterator { |
| typedef fusion::result_of::value_of<bo>::h h; |
| }; |
| template <typename bo> struct bh<fusion_iterator<bo>> { |
| typedef fusion_iterator<typename fusion::result_of::bh<bo>::h> h; |
| }; |
| template <> struct begin_impl<int> { |
| template <typename Sequence> struct apply { |
| typedef fusion_iterator<typename fusion::result_of::begin<Sequence>::h> h; |
| }; |
| }; |
| template <> struct end_impl<int> { |
| template <typename Sequence> struct apply { |
| typedef fusion_iterator<typename fusion::result_of::ab<Sequence>::h> h; |
| }; |
| }; |
| } // namespace aw |
| namespace fusion { |
| template <> struct next_impl<int> { |
| template <typename bo> struct apply { |
| typedef aw::cg< |
| result_of::equal_to<typename result_of::bh<typename bo::first_type>::h, |
| typename bo::last_type>, |
| typename bo::concat_type>::h h; |
| }; |
| }; |
| template <> struct value_of_impl<int> { |
| template <typename bo> struct apply { |
| typedef result_of::value_of<typename bo::first_type>::h h; |
| }; |
| }; |
| template <typename First, typename Last, typename Concat> |
| struct joint_view_iterator { |
| typedef First first_type; |
| typedef Last last_type; |
| typedef Concat concat_type; |
| typedef int fusion_tag; |
| }; |
| struct joint_view_tag; |
| template <> struct begin_impl<joint_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef Sequence::first_type first_type; |
| typedef Sequence::last_type last_type; |
| typedef Sequence::concat_type concat_type; |
| typedef aw::cg<result_of::equal_to<first_type, last_type>, concat_type, |
| joint_view_iterator<first_type, last_type, concat_type>>::h |
| h; |
| }; |
| }; |
| template <> struct end_impl<joint_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef Sequence::concat_last_type h; |
| }; |
| }; |
| template <typename Sequence1, typename Sequence2> struct joint_view { |
| typedef joint_view_tag fusion_tag; |
| typedef result_of::begin<Sequence1>::h first_type; |
| typedef result_of::ab<Sequence1>::h last_type; |
| typedef result_of::begin<Sequence2>::h concat_type; |
| typedef result_of::ab<Sequence2>::h concat_last_type; |
| }; |
| struct single_view_iterator_tag; |
| template <typename SingleView, typename Pos> struct single_view_iterator { |
| typedef single_view_iterator_tag fusion_tag; |
| typedef SingleView::value_type value_type; |
| typedef Pos position; |
| typedef SingleView single_view_type; |
| }; |
| template <> struct next_impl<single_view_iterator_tag> { |
| template <typename bo> struct apply { |
| typedef single_view_iterator<typename bo::single_view_type, |
| typename aw::bh<typename bo::position>::h> |
| h; |
| }; |
| }; |
| template <> struct value_of_impl<single_view_iterator_tag> { |
| template <typename bo> struct apply { |
| typedef bo::value_type h; |
| }; |
| }; |
| struct single_view_tag; |
| template <> struct begin_impl<single_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef single_view_iterator<Sequence, aw::bd<0>> h; |
| }; |
| }; |
| template <> struct end_impl<single_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef single_view_iterator<Sequence, aw::bd<1>> h; |
| }; |
| }; |
| template <typename aq> struct single_view { |
| typedef single_view_tag fusion_tag; |
| typedef aq value_type; |
| }; |
| namespace result_of { |
| template <typename Sequence, typename aq> struct push_back { |
| typedef joint_view<Sequence, single_view<aq>> h; |
| }; |
| } // namespace result_of |
| template <typename Sequence> |
| bu<result_of::begin<Sequence>>::h begin(Sequence r) { |
| return result_of::begin<Sequence>::call(r); |
| } |
| template <typename Sequence> struct apply { |
| typedef detail::build_tuple_cons<typename result_of::begin<Sequence>::h, |
| typename result_of::ab<Sequence>::h> |
| build_tuple_cons; |
| typedef build_tuple_cons::h h; |
| static h call(Sequence r) { |
| typename result_of::begin<Sequence>::h __trans_tmp_6 = begin(r); |
| typename result_of::ab<Sequence>::h __trans_tmp_7(r); |
| return build_tuple_cons::call(__trans_tmp_6, __trans_tmp_7); |
| } |
| }; |
| namespace detail { |
| template <typename First, typename Last, typename df> |
| void for_each_linear(First, Last, df, bb<true>) {} |
| template <typename First, typename Last, typename df> |
| void for_each_linear(First r, Last p2, df p3, bb<false>) { |
| p3(*r); |
| for_each_linear( |
| bh(r), p2, p3, |
| result_of::equal_to<typename result_of::bh<First>::h, Last>()); |
| } |
| template <typename Sequence, typename df, typename dn> |
| void for_each_dispatch(Sequence &r, df p2, dn) { |
| typename result_of::begin<Sequence>::h __trans_tmp_2 = r; |
| typename result_of::ab<Sequence>::h __trans_tmp_3 = 0; |
| for_each_linear(__trans_tmp_2, __trans_tmp_3, p2, |
| result_of::equal_to<typename result_of::begin<Sequence>::h, |
| typename result_of::ab<Sequence>::h>()); |
| } |
| template <typename Sequence, typename df> void for_each(Sequence &r, df p2) { |
| for_each_dispatch(r, p2, int()); |
| } |
| } // namespace detail |
| template <typename df> |
| void for_each(tuple<join_iterator, join_iterator> &r, df p2) { |
| detail::for_each(r, p2); |
| } |
| struct transform_view_iterator_tag; |
| template <> struct deref_impl<transform_view_iterator_tag> { |
| template <typename bo> struct apply { |
| typedef result_of::deref<typename bo::first_type>::h value_type; |
| typedef bo::transform_type df; |
| typedef typename result_of<df(value_type)>::h h; |
| static h call(bo r) { return r.f(*r.ad); } |
| }; |
| }; |
| template <typename First, typename df> struct transform_view_iterator { |
| typedef transform_view_iterator_tag fusion_tag; |
| typedef First first_type; |
| typedef df transform_type; |
| first_type ad; |
| transform_type f; |
| }; |
| template <> struct next_impl<transform_view_iterator_tag> { |
| template <typename bo> struct apply { |
| typedef transform_view_iterator< |
| typename result_of::bh<typename bo::first_type>::h, |
| typename bo::transform_type> |
| h; |
| static h call(bo r) { return h(bh(r.ad)); } |
| }; |
| }; |
| template <> struct value_of_impl<transform_view_iterator_tag> { |
| template <typename bo> struct apply { |
| typedef av::result_of<typename bo::transform_type( |
| typename result_of::value_of<typename bo::first_type>::h)>::h h; |
| }; |
| }; |
| struct transform_view_tag; |
| template <> struct begin_impl<transform_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef transform_view_iterator<typename Sequence::first_type, |
| typename Sequence::transform_type> |
| h; |
| static h call(Sequence r) { return h(r.ad()); } |
| }; |
| }; |
| template <> struct end_impl<transform_view_tag> { |
| template <typename Sequence> struct apply { |
| typedef transform_view_iterator<typename Sequence::last_type, |
| typename Sequence::transform_type> |
| h; |
| }; |
| }; |
| } // namespace fusion |
| namespace aw { |
| template <> struct clear_impl<int> { |
| template <typename> struct apply { |
| typedef tuple<> h; |
| }; |
| }; |
| } // namespace aw |
| namespace fusion { |
| namespace result_of { |
| template <typename Sequence> struct convert { |
| typedef apply<Sequence> gen; |
| typedef gen::h h; |
| }; |
| } // namespace result_of |
| template <typename, typename Sequence> |
| result_of::convert<Sequence>::h convert(Sequence r) { |
| typedef typename result_of::convert<Sequence>::gen gen; |
| return gen::call(r); |
| } |
| } // namespace fusion |
| namespace aw { |
| template <> struct push_back_impl<int> { |
| template <typename Sequence, typename aq> struct apply { |
| typedef fusion::result_of::convert< |
| typename fusion::result_of::push_back<Sequence, aq>::h>::h h; |
| }; |
| }; |
| } // namespace aw |
| namespace fusion { |
| template <typename, typename df> struct transform_view { |
| typedef transform_view_tag fusion_tag; |
| typedef result_of::begin<const tuple<join_iterator, join_iterator>>::h |
| first_type; |
| typedef result_of::ab<const tuple<>>::h last_type; |
| typedef df transform_type; |
| first_type ad() { return seq; } |
| aw::cg<traits::is_view, int, const tuple<join_iterator, join_iterator> &>::h |
| seq; |
| }; |
| namespace result_of { |
| template <typename, typename df> struct transform { |
| typedef transform_view<const tuple<join_iterator, join_iterator>, df> h; |
| }; |
| } // namespace result_of |
| template <typename df> |
| result_of::transform<int, df>::h |
| transform(const tuple<join_iterator, join_iterator> &r, df) { |
| return transform_view<const tuple<join_iterator, join_iterator>, df>(r); |
| } |
| namespace detail { |
| struct sequence_equal_to { |
| template <typename I1, typename I2> static bool call(I1, I2, bb<true>); |
| template <typename I1, typename I2> static bool call(I1 r, I2 p2, bb<false>) { |
| return *r == *p2 && call(bh(r), bh(p2)); |
| } |
| template <typename I1, typename I2> static bool call(I1 r, I2 p2) { |
| result_of::equal_to<I1, result_of::ab<tuple<>>::h> eq; |
| return call(r, p2, eq); |
| } |
| }; |
| } // namespace detail |
| template <typename Seq2> |
| bool equal_to(const tuple<join_iterator, join_iterator> &r, Seq2 p2) { |
| boost_tuple_iterator __trans_tmp_27 = r; |
| return detail::sequence_equal_to::call(__trans_tmp_27, begin(p2)); |
| } |
| } // namespace fusion |
| namespace iterators { |
| struct increment_iterator { |
| template <typename bo> void operator()(bo &r) { ++r; } |
| }; |
| struct dereference_iterator { |
| template <typename> struct result; |
| template <typename This, typename bo> struct result<This(bo)> { |
| typedef by<bo>::h h; |
| }; |
| template <typename bo> result<dereference_iterator(bo)>::h operator()(bo r) { |
| return *r; |
| } |
| }; |
| struct minimum_traversal_category_in_iterator_tuple; |
| typedef aw::transform<tuple<join_iterator, join_iterator>>::h ah; |
| static ah call(fusion::transform_view<const tuple<join_iterator, join_iterator>, |
| dereference_iterator> |
| r) { |
| return convert < ah >> (r); |
| } |
| template <typename> |
| struct zip_iterator |
| : iterator_facade<zip_iterator<int>, ah, |
| minimum_traversal_category_in_iterator_tuple, ah> { |
| const tuple<join_iterator, join_iterator> &get_iterator_tuple() const { |
| return m_iterator_tuple; |
| } |
| ah dereference() { |
| const tuple<join_iterator, join_iterator> &__trans_tmp_21 = |
| get_iterator_tuple(); |
| fusion::transform_view __trans_tmp_26 = |
| fusion::transform(__trans_tmp_21, dereference_iterator()); |
| return call(__trans_tmp_26); |
| } |
| template <typename OtherIteratorTuple> bool equal(OtherIteratorTuple) const { |
| const tuple<join_iterator, join_iterator> &__trans_tmp_24 = |
| get_iterator_tuple(); |
| tuple<join_iterator, join_iterator> __trans_tmp_25; |
| return fusion::equal_to(__trans_tmp_24, __trans_tmp_25); |
| } |
| void increment() { fusion::for_each(m_iterator_tuple, increment_iterator()); } |
| tuple<join_iterator, join_iterator> m_iterator_tuple; |
| }; |
| } // namespace iterators |
| using iterators::zip_iterator; |
| } // namespace av |
| struct Construct_curve_2 { |
| template <typename ForwardIterator> |
| void operator()(ForwardIterator r, ForwardIterator p2) const { |
| constructor_impl(r, p2, int()); |
| } |
| void operator()(int) { |
| av::join_iterator __trans_tmp_11, __trans_tmp_18; |
| operator()(__trans_tmp_18, __trans_tmp_11); |
| } |
| template <typename ForwardIterator> |
| void constructor_impl(ForwardIterator r, ForwardIterator p2, b<false>) const { |
| Arr_polycurve_traits_2::Construct_curve_2()(r, p2); |
| } |
| void constructor_impl(av::join_iterator, av::join_iterator, b<true>) const { |
| auto point_pair_to_segment = [](av::zip_iterator<av::tuple<>>::ah t) { |
| construct_curve_2_object()(0, get<1>(t)); |
| }; |
| av::zip_iterator<int> __trans_tmp_20, __trans_tmp_22; |
| operator()(make_transform_iterator(__trans_tmp_22, point_pair_to_segment), |
| make_transform_iterator(__trans_tmp_20, point_pair_to_segment)); |
| } |
| }; |
| int __trans_tmp_33___trans_tmp_16; |
| int |
| __trans_tmp_33() |
| { |
| Construct_curve_2 __trans_tmp_10; |
| __trans_tmp_10(__trans_tmp_33___trans_tmp_16); |
| } |
| |
| // { dg-final { scan-assembler-times "call\[ \t\]__tls_get_addr@PLT" 1 { target { ! ia32 } } } } |