34 #ifndef SHARK_LINALG_IMPL_INITIALIZE_H
35 #define SHARK_LINALG_IMPL_INITIALIZE_H
41 #include <boost/type_traits/remove_reference.hpp>
111 return static_cast<Self&
>(*this);
114 return static_cast<const Self&
>(*this);
119 template<
class Expression>
122 Expression m_expression;
123 typedef typename boost::remove_reference<Expression>::type::const_iterator IndexIterator;
128 for(IndexIterator vecPos = m_expression.begin(); vecPos != m_expression.end();++vecPos, ++pos){
134 for(IndexIterator vecPos = m_expression.begin(); vecPos != m_expression.end();++vecPos, ++pos){
135 m_expression(vecPos.index()) = *pos;
139 IndexIterator begin = m_expression.begin();
140 IndexIterator end = m_expression.end();
146 template<
class Matrix>
150 typedef typename Matrix::const_iterator1 Iterator;
151 typedef typename Matrix::const_iterator2 IndexIterator;
156 for(Iterator outer = m_matrix.begin1(); outer != m_matrix.end1(); ++outer){
157 for(IndexIterator inner = outer.begin(); inner != outer.end(); ++inner,++pos){
164 for(Iterator outer = m_matrix.begin1(); outer != m_matrix.end1(); ++outer){
165 for(IndexIterator inner = outer.begin(); inner != outer.end(); ++inner,++pos){
166 m_matrix(inner.index1(),inner.index2()) = *pos;
171 std::size_t elements = 0;
172 for(Iterator pos = m_matrix.begin1(); pos != m_matrix.end1(); ++pos){
173 IndexIterator pos1Iter=pos.begin();
174 IndexIterator pos2Iter=pos.end();
185 T& m_parameterizable;
190 RealVector
parameters = m_parameterizable.parameterVector();
192 vectorWriter.
init(pos);
198 vectorWriter.
split(pos);
199 m_parameterizable.setParameterVector(parameters);
202 return m_parameterizable.numberOfParameters();
209 T* m_parameterizable;
214 RealVector
parameters = m_parameterizable->parameterVector();
216 vectorWriter.
init(pos);
222 vectorWriter.
split(pos);
223 m_parameterizable->setParameterVector(parameters);
226 return m_parameterizable->numberOfParameters();
233 T* m_parameterizable;
238 RealVector
parameters = m_parameterizable->parameterVector();
240 vectorWriter.
init(pos);
246 vectorWriter.
split(pos);
247 m_parameterizable->setParameterVector(parameters);
250 return m_parameterizable->numberOfParameters();
258 template<
class Iterator,
class Wrapper>
272 for(Iterator elem = m_begin; elem!= m_end; ++elem){
273 Wrapper writer(*elem);
279 for(Iterator elem= m_begin; elem!= m_end; ++elem){
280 Wrapper vectorWriter(*elem);
281 vectorWriter.split(pos);
285 std::size_t elements = 0;
286 for(Iterator elem = m_begin; elem != m_end; ++elem){
287 Wrapper vectorWriter(*elem);
288 elements += vectorWriter.size();
298 template<
class Iterator>
299 void init(Iterator& pos)
const{}
301 template<
class Iterator>
314 template<
class Parent,
class Expression>
318 Expression m_expression;
321 :m_parent(parent),m_expression(expression){}
324 template<
class Iterator>
327 m_expression.init(pos);
331 template<
class Iterator>
334 m_expression.split(pos);
338 return m_parent.size()+m_expression.size();
349 template<
class VectorExpression,
class InitExpression>
352 InitExpression m_expression;
359 :m_expression(expression),
m_vector(vector) {
375 typename boost::remove_reference<VectorExpression>::type::iterator iter =
m_vector.begin();
376 m_expression.init(iter);
383 #define SHARK_INIT_INIT(Type,Argument)\
384 template<class Sink,class Source>\
385 VectorInitializer<Sink,InitializerNode<InitializerEnd, Type> > operator<<(const ADLVector<Sink>& sink,const Argument& source){\
386 typedef InitializerNode<InitializerEnd,Type > Init;\
387 return VectorInitializer<Sink, Init>(sink.vector,Init(InitializerEnd(),source()));\
393 #undef SHARK_INIT_INIT
397 VectorInitializer<Sink,InitializerNode<InitializerEnd,Scalar<const typename Sink::value_type> > >
398 operator<<(const ADLVector<Sink>& sink,
const typename Sink::value_type& value){
403 VectorInitializer<Sink&,InitializerNode<InitializerEnd,Scalar<const typename Sink::value_type> > >
404 operator<<(const ADLVector<Sink&>& sink,
const typename Sink::value_type& value){
411 #define SHARK_INIT_COMMA(Type, Argument)\
412 template<class Sink,class Init,class Source>\
413 VectorInitializer<Sink,InitializerNode<Init,Type > > operator,(const VectorInitializer<Sink,Init >& init,const Argument& vec){\
415 typedef InitializerNode<Init,Type > newExpression;\
416 return VectorInitializer<Sink, newExpression>(init.m_vector,newExpression(init.expression(),vec()));\
422 #undef SHARK_INIT_COMMA
427 template<
class Sink,
class Init>
428 VectorInitializer<Sink,InitializerNode<Init,Scalar<const typename Sink::value_type> > >
434 template<
class Sink,
class Init>
435 VectorInitializer<Sink&,InitializerNode<Init,Scalar<const typename Sink::value_type> > >
448 template<
class VectorExpression,
class SplittingExpression>
451 SplittingExpression m_expression;
458 :m_expression(expression),
m_vector(vector){
474 typename boost::remove_reference<VectorExpression>::type::const_iterator iter =
m_vector.begin();
475 m_expression.split(iter);
481 #define SHARK_SPLIT_INIT(Type,Argument)\
482 template<class Source,class Sink>\
483 VectorSplitter<Source,InitializerNode<InitializerEnd, Type> >\
484 operator>>(const ADLVector<Source>& source,Argument& sink){\
485 typedef InitializerNode<InitializerEnd,Type > Init;\
486 return VectorSplitter<Source, Init>(source.vector,Init(InitializerEnd(),sink()));\
492 #undef SHARK_SPLIT_INIT
496 VectorSplitter<Sink,InitializerNode<InitializerEnd,Scalar<typename Sink::value_type> > >
502 VectorSplitter<Sink&,InitializerNode<InitializerEnd,Scalar<typename Sink::value_type> > >
508 #define SHARK_SPLIT_PROXY_INIT(Argument)\
509 template<class Source,class Sink>\
510 VectorSplitter<Source,InitializerNode<InitializerEnd, VectorExpression<Argument> > >\
511 operator>>(const ADLVector<Source>& source,Argument sink){\
512 typedef InitializerNode<InitializerEnd,VectorExpression<Argument> > Init;\
513 return VectorSplitter<Source, Init>(source.vector,Init(InitializerEnd(),sink));\
521 #undef SHARK_SPLIT_PROXY_INIT
526 template<
class Source,
class Init,
class Sink>
527 VectorSplitter<Source,InitializerNode<Init,VectorExpression<Sink&> > >
534 template<
class Source,
class Init,
class Sink>
535 VectorSplitter<Source,InitializerNode<Init,Sink > >
543 template<
class Source,
class Init>
544 VectorSplitter<Source,InitializerNode<Init,Scalar<typename Source::value_type> > >
550 template<
class Source,
class Init>
551 VectorSplitter<Source&,InitializerNode<Init,Scalar<typename Source::value_type> > >
557 #define SHARK_SPLIT_PROXY_COMMA(Argument)\
558 template<class Source,class Init,class Sink>\
559 VectorSplitter<Source,InitializerNode<Init,VectorExpression<Argument> > >\
560 operator,(const VectorSplitter<Source,Init >& source, Argument vec){\
562 typedef InitializerNode<Init,VectorExpression<Argument> > newExpression;\
563 return VectorSplitter<Source, newExpression>(source.m_vector,newExpression(source.expression(),vec));\
568 #undef SHARK_SPLIT_PROXY_COMMA