annotate gcc/testsuite/g++.dg/torture/pr82985.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
131
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
1 /* { dg-do compile } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
2 /* { dg-additional-options "-w" } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
3 /* { dg-additional-options "-mavx2" { target { x86_64-*-* i?86-*-* } } } */
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
4
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
5 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
6 template < typename _Default > struct __detector { using type = _Default; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
7 template < typename _Default, template < typename > class >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
8 using __detected_or = __detector< _Default >;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
9 template < typename _Default, template < typename > class _Op >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
10 using __detected_or_t = typename __detected_or< _Default, _Op >::type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
11 template < typename > struct iterator_traits;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
12 template < typename _Tp > struct iterator_traits< _Tp * > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
13 typedef _Tp reference;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
14 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
15 } // std
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
16 using std::iterator_traits;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
17 template < typename _Iterator, typename > struct __normal_iterator {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
18 typename iterator_traits< _Iterator >::reference operator*();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
19 void operator++();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
20 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
21 template < typename _IteratorL, typename _IteratorR, typename _Container >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
22 int operator!=(__normal_iterator< _IteratorL, _Container >,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
23 __normal_iterator< _IteratorR, _Container >);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
24 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
25 template < typename _Tp > struct allocator { typedef _Tp value_type; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
26 struct __allocator_traits_base {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
27 template < typename _Tp > using __pointer = typename _Tp::pointer;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
28 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
29 template < typename _Alloc > struct allocator_traits : __allocator_traits_base {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
30 using pointer = __detected_or_t< typename _Alloc::value_type *, __pointer >;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
31 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
32 } // std
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
33 typedef double __m128d __attribute__((__vector_size__(16)));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
34 typedef double __m256d __attribute__((__vector_size__(32)));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
35 enum { InnerVectorizedTraversal, LinearVectorizedTraversal };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
36 enum { ReadOnlyAccessors };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
37 template < int, typename Then, typename > struct conditional {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
38 typedef Then type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
39 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
40 template < typename Then, typename Else > struct conditional< 0, Then, Else > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
41 typedef Else type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
42 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
43 template < typename, typename > struct is_same {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
44 enum { value };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
45 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
46 template < typename T > struct is_same< T, T > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
47 enum { value = 1 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
48 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
49 template < typename > struct traits;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
50 struct accessors_level {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
51 enum { has_direct_access, has_write_access, value };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
52 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
53 template < typename > struct EigenBase;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
54 template < typename > struct PlainObjectBase;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
55 template < typename, int = accessors_level::value > struct DenseCoeffsBase;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
56 template < typename, int, int, int = 0, int = 0, int = 0 > struct Matrix;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
57 template < typename > struct MatrixBase;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
58 template < typename, int, int, bool = 0 > struct Block;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
59 struct VectorBlock;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
60 template < typename, typename > struct CwiseNullaryOp;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
61 template < typename, typename, typename > struct CwiseBinaryOp;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
62 template < typename, int = accessors_level::has_write_access > struct MapBase;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
63 template < typename > struct packet_traits;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
64 template < typename > struct unpacket_traits;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
65 template < int Size, typename PacketType,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
66 int = Size == is_same< PacketType, typename unpacket_traits<
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
67 PacketType >::half >::value >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
68 struct find_best_packet_helper;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
69 template < int Size, typename PacketType >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
70 struct find_best_packet_helper< Size, PacketType, 1 > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
71 typedef PacketType type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
72 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
73 template < int Size, typename PacketType >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
74 struct find_best_packet_helper< Size, PacketType, 0 > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
75 typedef typename find_best_packet_helper<
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
76 1, typename unpacket_traits< PacketType >::half >::type type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
77 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
78 template < typename T, int Size > struct find_best_packet {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
79 typedef typename find_best_packet_helper<
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
80 Size, typename packet_traits< T >::type >::type type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
81 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
82 struct compute_matrix_flags {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
83 enum { ret = 1 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
84 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
85 struct ref_selector {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
86 typedef Matrix< double, 10, 1 > &type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
87 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
88 template < typename Derived > struct dense_xpr_base {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
89 typedef MatrixBase< Derived > type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
90 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
91 template < typename ExpressionType > struct is_lvalue {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
92 enum { value = traits< ExpressionType >::Flags };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
93 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
94 template < typename Packet > void pmul(Packet);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
95 template < typename Packet >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
96 Packet pload(const typename unpacket_traits< Packet >::type *);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
97 template < typename Packet >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
98 Packet pset1(const typename unpacket_traits< Packet >::type &);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
99 template < typename Scalar, typename Packet > void pstoreu(Scalar, Packet &);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
100 template < typename Packet, int >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
101 Packet ploadt(const typename unpacket_traits< Packet >::type *from) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
102 return pload< Packet >(from);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
103 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
104 template < typename Scalar, typename Packet, int >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
105 void pstoret(Scalar *to, const Packet from) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
106 pstoreu(to, from);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
107 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
108 typedef __m128d Packet2d;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
109 template <> struct unpacket_traits< Packet2d > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
110 typedef double type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
111 typedef Packet2d half;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
112 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
113 template <> Packet2d pload(const double *from) { return *(__m128d *)from; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
114 typedef __m256d Packet4d;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
115 template <> struct packet_traits< double > { typedef Packet4d type; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
116 template <> struct unpacket_traits< Packet4d > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
117 typedef double type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
118 typedef Packet2d half;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
119 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
120 __m256d pset1___trans_tmp_1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
121 template <> Packet4d pset1(const double &) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
122 int __A;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
123 pset1___trans_tmp_1 = __m256d{__A};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
124 return pset1___trans_tmp_1;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
125 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
126 template <> void pstoreu(double *to, const Packet4d &from) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
127 *(__attribute__((__vector_size__(4 * sizeof(double)))) double *)to = from;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
128 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
129 struct scalar_product_op {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
130 template < typename Packet > void packetOp(Packet a, Packet) { pmul(a); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
131 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
132 struct scalar_constant_op {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
133 template < typename PacketType > PacketType packetOp() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
134 return pset1< PacketType >(0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
135 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
136 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
137 struct assign_op {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
138 template < int, typename Packet > void assignPacket(double *a, Packet b) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
139 pstoret< double, Packet, 0 >(a, b);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
140 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
141 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
142 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
143 struct DenseCoeffsBase< Derived, 0 > : EigenBase< Derived > {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
144 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
145 struct DenseCoeffsBase< Derived > : DenseCoeffsBase< Derived, 0 > {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
146 template < typename Derived > struct DenseBase : DenseCoeffsBase< Derived > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
147 using DenseCoeffsBase< Derived >::derived;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
148 enum { SizeAtCompileTime, MaxSizeAtCompileTime };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
149 static CwiseNullaryOp< scalar_constant_op, Derived > Constant();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
150 Derived &setConstant();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
151 struct FixedSegmentReturnType {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
152 typedef VectorBlock Type;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
153 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
154 template < int > typename FixedSegmentReturnType::Type segment() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
155 return typename FixedSegmentReturnType::Type(derived(), 0, 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
156 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
157 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
158 template < typename Derived > struct MatrixBase : DenseBase< Derived > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
159 using DenseBase< Derived >::derived;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
160 template < typename OtherDerived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
161 CwiseBinaryOp< scalar_product_op, const Derived, const OtherDerived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
162 cwiseProduct(OtherDerived) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
163 return CwiseBinaryOp< scalar_product_op, const Derived,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
164 const OtherDerived >(derived(), derived());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
165 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
166 template < typename OtherDerived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
167 Derived &operator=(const DenseBase< OtherDerived > &);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
168 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
169 template < typename Derived > struct EigenBase {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
170 Derived &derived() { return *static_cast< Derived * >(this); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
171 Derived derived() const;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
172 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
173 template < typename > struct binary_evaluator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
174 template < typename Derived > struct evaluator {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
175 typedef Derived PlainObjectType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
176 typedef typename PlainObjectType::Scalar Scalar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
177 enum { IsVectorAtCompileTime, Flags };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
178 evaluator(PlainObjectType m) : m_data(m.data()) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
179 Scalar &coeffRef(int, int);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
180 template < int, typename PacketType > PacketType packet(int, int) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
181 return ploadt< PacketType, 0 >(m_data);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
182 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
183 const Scalar *m_data;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
184 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
185 template < typename Scalar, int Rows, int Cols, int Options, int MaxRows,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
186 int MaxCols >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
187 struct evaluator< Matrix< Scalar, Rows, Cols, Options, MaxRows, MaxCols > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
188 : evaluator< PlainObjectBase< Matrix< Scalar, Rows, Cols > > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
189 typedef Matrix< Scalar, Rows, Cols > XprType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
190 evaluator(XprType m) : evaluator< PlainObjectBase< XprType > >(m) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
191 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
192 struct nullary_wrapper {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
193 template < typename T, typename IndexType >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
194 T packetOp(scalar_constant_op op, IndexType, IndexType) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
195 return op.packetOp< T >();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
196 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
197 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
198 template < typename NullaryOp, typename PlainObjectType >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
199 struct evaluator< CwiseNullaryOp< NullaryOp, PlainObjectType > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
200 evaluator(CwiseNullaryOp< NullaryOp, PlainObjectType >);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
201 template < int, typename PacketType, typename IndexType >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
202 PacketType packet(IndexType row, IndexType col) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
203 return m_wrapper.packetOp< PacketType >(m_functor, row, col);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
204 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
205 NullaryOp m_functor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
206 nullary_wrapper m_wrapper;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
207 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
208 template < typename BinaryOp, typename Lhs, typename Rhs >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
209 struct evaluator< CwiseBinaryOp< BinaryOp, Lhs, Rhs > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
210 : binary_evaluator< CwiseBinaryOp< BinaryOp, Lhs, Rhs > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
211 evaluator(CwiseBinaryOp< BinaryOp, Lhs, Rhs > xpr)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
212 : binary_evaluator< CwiseBinaryOp< BinaryOp, Lhs, Rhs > >(xpr) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
213 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
214 template < typename BinaryOp, typename Lhs, typename Rhs >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
215 struct binary_evaluator< CwiseBinaryOp< BinaryOp, Lhs, Rhs > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
216 binary_evaluator(CwiseBinaryOp< BinaryOp, Lhs, Rhs > xpr)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
217 : m_lhsImpl(xpr.lhs()), m_rhsImpl(xpr.rhs()) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
218 template < int, typename PacketType > PacketType packet(int, int) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
219 PacketType __trans_tmp_1 = m_lhsImpl.template packet< 0, PacketType >(0, 0);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
220 PacketType __trans_tmp_2;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
221 m_functor.packetOp(__trans_tmp_1, __trans_tmp_2);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
222 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
223 BinaryOp m_functor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
224 evaluator< Lhs > m_lhsImpl;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
225 evaluator< Rhs > m_rhsImpl;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
226 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
227 template < typename Derived > struct mapbase_evaluator {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
228 typedef Derived XprType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
229 mapbase_evaluator(XprType map) : m_data(map.data()) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
230 typename XprType::Scalar &coeffRef(int, int) { return m_data[0]; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
231 typename XprType::PointerType m_data;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
232 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
233 template < int > struct block_evaluator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
234 template < typename ArgType, int BlockRows, int BlockCols, bool InnerPanel >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
235 struct evaluator< Block< ArgType, BlockRows, BlockCols, InnerPanel > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
236 : block_evaluator< BlockCols > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
237 enum { Flags };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
238 evaluator(Block< ArgType, 1, 1 > block) : block_evaluator< 1 >(block) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
239 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
240 template < int BlockCols >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
241 struct block_evaluator
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
242 : mapbase_evaluator< Block< Matrix< double, 10, 1 >, 1, BlockCols > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
243 typedef Block< Matrix< double, 10, 1 >, 1, BlockCols > XprType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
244 block_evaluator(XprType block) : mapbase_evaluator< XprType >(block) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
245 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
246 template < typename DstEvaluator > struct copy_using_evaluator_traits {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
247 typedef typename DstEvaluator::XprType Dst;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
248 typedef typename Dst::Scalar DstScalar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
249 enum { DstFlags = DstEvaluator::Flags };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
250 enum { InnerSize = DstFlags };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
251 typedef typename conditional<
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
252 int() == LinearVectorizedTraversal,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
253 typename find_best_packet< DstScalar, Dst::SizeAtCompileTime >::type,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
254 typename find_best_packet< DstScalar, InnerSize >::type >::type
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
255 PacketType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
256 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
257 template < typename Kernel >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
258 struct copy_using_evaluator_innervec_CompleteUnrolling {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
259 enum { outer, inner, SrcAlignment, DstAlignment };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
260 static void run(Kernel kernel) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
261 kernel.template assignPacketByOuterInner< DstAlignment, SrcAlignment,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
262 typename Kernel::PacketType >(
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
263 outer, inner);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
264 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
265 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
266 template < typename Kernel > struct dense_assignment_loop {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
267 static void run(Kernel kernel) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
268 copy_using_evaluator_innervec_CompleteUnrolling< Kernel >::run(kernel);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
269 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
270 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
271 template < typename DstEvaluatorTypeT, typename SrcEvaluatorTypeT,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
272 typename Functor >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
273 struct generic_dense_assignment_kernel {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
274 typedef DstEvaluatorTypeT DstXprType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
275 typedef DstEvaluatorTypeT DstEvaluatorType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
276 typedef SrcEvaluatorTypeT SrcEvaluatorType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
277 typedef typename copy_using_evaluator_traits< DstEvaluatorTypeT >::PacketType
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
278 PacketType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
279 generic_dense_assignment_kernel(DstEvaluatorType dst, SrcEvaluatorType src,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
280 Functor, DstXprType dstExpr)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
281 : m_dst(dst), m_src(src), m_dstExpr(dstExpr) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
282 template < int StoreMode, int LoadMode, typename >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
283 void assignPacketByOuterInner(long, long) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
284 long row;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
285 long col;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
286 m_functor.template assignPacket< StoreMode >(
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
287 &m_dst.coeffRef(row, col),
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
288 m_src.template packet< LoadMode, PacketType >(row, col));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
289 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
290 DstEvaluatorType &m_dst;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
291 SrcEvaluatorType m_src;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
292 Functor m_functor;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
293 DstXprType m_dstExpr;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
294 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
295 template < typename DstXprType, typename SrcXprType, typename Functor >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
296 void call_dense_assignment_loop(DstXprType dst, SrcXprType src, Functor func) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
297 typedef evaluator< DstXprType > DstEvaluatorType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
298 typedef evaluator< SrcXprType > SrcEvaluatorType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
299 SrcEvaluatorType srcEvaluator(src);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
300 DstEvaluatorType dstEvaluator(dst);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
301 typedef generic_dense_assignment_kernel< DstEvaluatorType, SrcEvaluatorType,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
302 Functor >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
303 Kernel;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
304 Kernel kernel(dstEvaluator, srcEvaluator, func, dst);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
305 dense_assignment_loop< Kernel >::run(kernel);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
306 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
307 template < typename, typename, typename > struct Assignment;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
308 template < typename Dst, typename Src > void call_assignment(Dst dst, Src src) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
309 call_assignment(dst, src, assign_op());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
310 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
311 template < typename Dst, typename Src, typename Func >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
312 void call_assignment(Dst dst, Src src, Func func) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
313 call_assignment_no_alias(dst, src, func);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
314 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
315 template < typename Dst, typename Src, typename Func >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
316 void call_assignment_no_alias(Dst dst, Src src, Func func) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
317 enum { NeedToTranspose };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
318 Assignment< typename conditional< NeedToTranspose, int, Dst >::type, Src,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
319 Func >::run(dst, src, func);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
320 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
321 template < typename DstXprType, typename SrcXprType, typename Functor >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
322 struct Assignment {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
323 static void run(DstXprType dst, SrcXprType src, Functor func) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
324 call_dense_assignment_loop(dst, src, func);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
325 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
326 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
327 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
328 template < typename OtherDerived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
329 Derived &MatrixBase< Derived >::
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
330 operator=(const DenseBase< OtherDerived > &other) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
331 call_assignment(derived(), other.derived());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
332 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
333 template < int Size > struct plain_array { double array[Size]; };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
334 template < int Size > class DenseStorage {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
335 plain_array< Size > m_data;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
336
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
337 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
338 const double *data() const { return m_data.array; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
339 double *data() { return m_data.array; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
340 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
341 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
342 struct PlainObjectBase : dense_xpr_base< Derived >::type {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
343 typedef typename dense_xpr_base< Derived >::type Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
344 typedef typename traits< Derived >::Scalar Scalar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
345 DenseStorage< Base::MaxSizeAtCompileTime > m_storage;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
346 const Scalar *data() const { return m_storage.data(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
347 Scalar *data() { return m_storage.data(); }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
348 PlainObjectBase() {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
349 template < typename OtherDerived > PlainObjectBase(OtherDerived other) {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
350 call_assignment_no_alias(this->derived(), other, assign_op());
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
351 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
352 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
353 template < typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
354 int _MaxCols >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
355 struct traits< Matrix< _Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
356 typedef _Scalar Scalar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
357 enum { Flags = compute_matrix_flags::ret };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
358 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
359 template < typename, int _Rows, int _Cols, int, int, int >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
360 struct Matrix : PlainObjectBase< Matrix< double, _Rows, _Cols > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
361 PlainObjectBase< Matrix > Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
362 Matrix() {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
363 template < typename OtherDerived > Matrix(OtherDerived other) : Base(other) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
364 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
365 template < typename, typename, typename > struct CwiseBinaryOp {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
366 typedef ref_selector::type LhsNested;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
367 CwiseBinaryOp(Matrix< double, 10, 1 > &aLhs, Matrix< double, 0, 0 >)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
368 : m_lhs(aLhs) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
369 LhsNested lhs() { return m_lhs; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
370 Matrix< double, 8, 1 > rhs() {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
371 LhsNested m_lhs;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
372 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
373 template < typename NullaryOp, typename >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
374 struct CwiseNullaryOp
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
375 : dense_xpr_base< CwiseNullaryOp< NullaryOp, int > >::type {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
376 template < typename Derived > Derived &DenseBase< Derived >::setConstant() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
377 derived() = Constant();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
378 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
379 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
380 struct MapBase< Derived, ReadOnlyAccessors > : dense_xpr_base< Derived >::type {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
381 typedef typename dense_xpr_base< Derived >::type Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
382 typedef typename traits< Derived >::Scalar Scalar;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
383 typedef typename conditional< is_lvalue< Derived >::value, Scalar *,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
384 Scalar >::type PointerType;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
385 Scalar *data() { return m_data; }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
386 MapBase(PointerType dataPtr, long, long) : m_data(dataPtr) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
387 PointerType m_data;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
388 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
389 template < typename Derived >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
390 struct MapBase< Derived > : MapBase< Derived, ReadOnlyAccessors > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
391 typedef MapBase< Derived, ReadOnlyAccessors > Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
392 MapBase(typename Base::PointerType dataPtr, long rows, long cols)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
393 : Base(dataPtr, rows, cols) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
394 using MapBase< Derived, ReadOnlyAccessors >::Base::operator=;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
395 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
396 template < typename XprType, int BlockRows, int BlockCols, bool InnerPanel >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
397 struct traits< Block< XprType, BlockRows, BlockCols, InnerPanel > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
398 : traits< XprType > {};
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
399 template < int, int > struct BlockImpl_dense;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
400 template < typename, int, int, typename > class BlockImpl;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
401 template < typename, int BlockRows, int BlockCols, bool >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
402 struct Block : BlockImpl< Matrix< double, 10, 1 >, BlockRows, BlockCols, int > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
403 typedef BlockImpl< Matrix< double, 10, 1 >, BlockRows, BlockCols, int > Impl;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
404 using Impl::operator=;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
405 Block(Matrix< double, 10, 1 > &xpr, long startRow, long startCol,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
406 long blockRows, long blockCols)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
407 : Impl(xpr, startRow, startCol, blockRows, blockCols) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
408 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
409 template < typename XprType, int BlockRows, int BlockCols >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
410 struct BlockImpl< XprType, BlockRows, BlockCols, int >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
411 : BlockImpl_dense< BlockRows, BlockCols > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
412 typedef BlockImpl_dense< BlockRows, BlockCols > Impl;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
413 typedef Impl Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
414 using Base::operator=;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
415 BlockImpl(XprType &xpr, long startRow, long startCol, long blockRows,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
416 long blockCols)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
417 : Impl(xpr, startRow, startCol, blockRows, blockCols) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
418 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
419 template < int BlockRows, int BlockCols >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
420 struct BlockImpl_dense
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
421 : MapBase< Block< Matrix< double, 10, 1 >, BlockRows, BlockCols > > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
422 typedef MapBase< Block< Matrix< double, 10, 1 >, BlockRows, BlockCols > >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
423 Base;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
424 using Base::operator=;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
425 BlockImpl_dense(Matrix< double, 10, 1 > &xpr, long, long, long blockRows,
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
426 long blockCols)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
427 : Base(xpr.data(), blockRows, blockCols) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
428 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
429 struct VectorBlock : Block< int, traits< Matrix< double, 0, 1 > >::Flags, 1 > {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
430 VectorBlock(Matrix< double, 10, 1 > &vector, long start, long size)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
431 : Block(vector, 0, start, 1, size) {}
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
432 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
433 namespace std {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
434 template < typename _Alloc > struct _Vector_base {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
435 typedef typename allocator_traits< _Alloc >::pointer pointer;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
436 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
437 template < typename _Tp, typename _Alloc = allocator< _Tp > > class vector {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
438 public:
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
439 typedef __normal_iterator< typename _Vector_base< _Alloc >::pointer, int >
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
440 iterator;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
441 iterator begin();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
442 iterator end();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
443 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
444 struct FrameHessian {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
445 Matrix< double, 0, 1 > step;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
446 void setState(Matrix< double, 0, 1 >);
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
447 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
448 struct FullSystem {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
449 bool doStepFromBackup();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
450 vector< FrameHessian * > frameHessians;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
451 };
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
452 bool FullSystem::doStepFromBackup() {
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
453 Matrix< double, 10, 1 > pstepfac;
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
454 pstepfac.segment< 4 >().setConstant();
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
455 for (FrameHessian *fh : frameHessians)
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
456 fh->setState(pstepfac.cwiseProduct(fh->step));
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
457 }
84e7813d76e9 gcc-8.2
mir3636
parents:
diff changeset
458 } // namespace std