rheolef  6.5
vec_concat.h
Go to the documentation of this file.
1 #ifndef _RHEOLEF_VEC_CONCAT_H
2 #define _RHEOLEF_VEC_CONCAT_H
3 #include "rheolef/vec.h"
4 
5 namespace rheolef {
6 
7 template <class T, class M>
8 struct vec_concat_value {
9  typedef enum { scalar, scalars, vector} variant_type;
10  vec_concat_value (const T& x) : s(x), ss(), v(), variant(scalar) {}
11  vec_concat_value (const std::vector<T>& x) : s(), ss(x), v(), variant(scalars) {}
12  vec_concat_value (const vec<T,M>& x) : s(), ss(), v(x), variant(vector) {}
13 #ifdef TO_CLEAN
14 // io/debug:
15  friend std::ostream& operator<< (std::ostream& o, const vec_concat_value<T,M>& x) {
16  if (x.variant == scalar) return o << "s";
17  if (x.variant == scalars) return o << "ss";
18  else return o << "v";
19  }
20 #endif // TO_CLEAN
21 public:
22  T s;
23  std::vector<T> ss;
26 };
27 
28 template <class T, class M>
29 struct vec_concat {
30  typedef typename vec<T,M>::size_type size_type;
32 
33 
34  vec_concat () : _l() {}
35  vec<T,M> build_vec() const;
36 
37 #ifdef _RHEOLEF_HAVE_STD_INITIALIZER_LIST
38  vec_concat (const std::initializer_list<value_type>& il) : _l() {
39 #ifdef _RHEOLEF_HAVE_STD_INITIALIZER_ITERATOR
40  typedef typename std::initializer_list<value_type>::const_iterator const_iterator;
41 #else // _RHEOLEF_HAVE_STD_INITIALIZER_ITERATOR
42  typedef const value_type* const_iterator;
43 #endif // _RHEOLEF_HAVE_STD_INITIALIZER_ITERATOR
44  for (const_iterator iter = il.begin(); iter != il.end(); ++iter) {
45  _l.push_back(*iter);
46  }
47  }
48 #endif // _RHEOLEF_HAVE_STD_INITIALIZER_LIST
49 
50 #ifdef TO_CLEAN
51  friend std::ostream& operator<< (std::ostream& o, const vec_concat<T,M>& x) {
52  std::cout << "{";
53  for(typename std::list<value_type>::const_iterator iter = x._l.begin(); iter != x._l.end(); ++iter) {
54  std::cout << *iter << " ";
55  }
56  return std::cout << "}";
57  }
58 #endif // TO_CLEAN
59 
60 protected:
61  std::list<value_type> _l;
62 };
63 
64 #ifdef _RHEOLEF_HAVE_STD_INITIALIZER_LIST
65 template <class T, class M>
66 inline
67 vec<T,M>::vec (const std::initializer_list<vec_concat_value<T,M> >& init_list)
68 {
69  vec_concat<T,M> vc (init_list);
71 }
72 template <class T, class M>
73 inline
74 vec<T,M>&
75 vec<T,M>::operator= (const std::initializer_list<vec_concat_value<T,M> >& init_list)
76 {
77  vec_concat<T,M> vc (init_list);
79  return *this;
80 }
81 #endif // _RHEOLEF_HAVE_STD_INITIALIZER_LIST
82 
83 } // namespace rheolef
84 #endif // _RHEOLEF_VEC_CONCAT_H
85