Stan  2.5.0
probability, sampling & optimization
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
seq_view.hpp
Go to the documentation of this file.
1 #ifndef STAN__MATH__SEQ_VIEW_HPP
2 #define STAN__MATH__SEQ_VIEW_HPP
3 
4 #include <vector>
5 
7 
8 namespace stan {
9 
10  namespace math {
11 
12 
13  template <typename T>
14  struct store_type {
15  typedef const T& type;
16  };
17  template <>
18  struct store_type<double> {
19  typedef const double type;
20  };
21  template <>
22  struct store_type<int> {
23  typedef const int type;
24  };
25 
26 
27  template <typename T>
28  struct pass_type {
29  typedef const T& type;
30  };
31  template <>
32  struct pass_type<double> {
33  typedef double type;
34  };
35  template <>
36  struct pass_type<int> {
37  typedef int type;
38  };
39 
40 
41  // S assignable to T
42  template <typename T, typename S>
43  class seq_view {
44  private:
45  typename store_type<S>::type x_;
46  public:
48  : x_(x) {
49  }
50  inline typename pass_type<T>::type
51  operator[](int n) const {
52  return x_;
53  }
54  int size() const {
55  return 1;
56  }
57  };
58 
59  template <typename T, typename S>
60  class seq_view<T, Eigen::Matrix<S,Eigen::Dynamic,1> > {
61  private:
63  public:
64  seq_view(typename pass_type<Eigen::Matrix<S,Eigen::Dynamic,1> >::type x)
65  : x_(x) {
66  }
67  inline typename pass_type<T>::type
68  operator[](int n) const {
69  return x_(n);
70  }
71  int size() const {
72  return x_.size();
73  }
74  };
75 
76 
77  template <typename T, typename S>
78  class seq_view<T, Eigen::Matrix<S,1,Eigen::Dynamic> > {
79  private:
81  public:
82  seq_view(typename pass_type<Eigen::Matrix<S,1,Eigen::Dynamic> >::type x)
83  : x_(x) {
84  }
85  inline typename pass_type<T>::type
86  operator[](int n) const {
87  return x_(n);
88  }
89  int size() const {
90  return x_.size();
91  }
92  };
93 
94 
95 
96  // row-major order of returns to match std::vector
97  template <typename T, typename S>
98  class seq_view<T, Eigen::Matrix<S,Eigen::Dynamic,Eigen::Dynamic> > {
99  private:
101  public:
102  seq_view(typename pass_type<Eigen::Matrix<S,Eigen::Dynamic,Eigen::Dynamic> >::type x)
103  : x_(x) {
104  }
105  inline typename pass_type<T>::type
106  operator[](int n) const {
107  return x_(n / x_.cols(), n % x_.cols());
108  }
109  int size() const {
110  return x_.size();
111  }
112  };
113 
114  // question is how expensive the ctor is
115  template <typename T, typename S>
116  class seq_view<T, std::vector<S> > {
117  private:
118  typename store_type<std::vector<S> >::type x_;
119  const size_t elt_size_;
120  public:
121  seq_view(typename pass_type<std::vector<S> >::type x)
122  : x_(x),
123  elt_size_(x_.size() == 0 ? 0 : seq_view<T,S>(x_[0]).size()) {
124  }
125  inline typename pass_type<T>::type
126  operator[](int n) const {
127  return seq_view<T,S>(x_[n / elt_size_])[n % elt_size_];
128  }
129  int size() const {
130  return x_.size() * elt_size_;
131  }
132  };
133 
134  // BELOW HERE JUST FOR EFFICIENCY
135 
136  template <typename T>
137  class seq_view<T, std::vector<T> > {
138  private:
139  typename store_type<std::vector<T> >::type x_;
140  public:
141  seq_view(typename pass_type<std::vector<T> >::type x)
142  : x_(x) {
143  }
144  inline typename pass_type<T>::type
145  operator[](int n) const {
146  return x_[n];
147  }
148  int size() const {
149  return x_.size();
150  }
151  };
152 
153  // if vector of S with S assignable to T, also works
154  // use enable_if? (and disable_if for the general case)
155  template <typename T>
156  class seq_view<T, std::vector<std::vector<T> > > {
157  private:
158  typename store_type<std::vector<std::vector<T> > >::type x_;
159  const size_t cols_;
160  public:
161  seq_view(typename pass_type<std::vector<std::vector<T> > >::type x)
162  : x_(x),
163  cols_(x_.size() == 0 ? 0 : x_[0].size()) { }
164  inline typename pass_type<T>::type
165  operator[](int n) const {
166  return x_[n / cols_][n % cols_];
167  }
168  int size() const {
169  return x_.size() * cols_;
170  }
171  };
172 
173  template <>
174  class seq_view<double, std::vector<int> > {
175  private:
176  store_type<std::vector<int> >::type x_;
177  public:
178  seq_view(pass_type<std::vector<int> >::type x)
179  : x_(x) {
180  }
181  inline pass_type<double>::type operator[](int n) const {
182  return x_[n];
183  }
184  int size() const {
185  return x_.size();
186  }
187  };
188 
189 
190 
191 
192  }
193 }
194 
195 #endif
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:126
int size() const
Definition: seq_view.hpp:54
seq_view(typename pass_type< Eigen::Matrix< S, 1, Eigen::Dynamic > >::type x)
Definition: seq_view.hpp:82
seq_view(typename pass_type< S >::type x)
Definition: seq_view.hpp:47
seq_view(typename pass_type< Eigen::Matrix< S, Eigen::Dynamic, 1 > >::type x)
Definition: seq_view.hpp:64
pass_type< double >::type operator[](int n) const
Definition: seq_view.hpp:181
seq_view(typename pass_type< std::vector< S > >::type x)
Definition: seq_view.hpp:121
seq_view(pass_type< std::vector< int > >::type x)
Definition: seq_view.hpp:178
seq_view(typename pass_type< std::vector< std::vector< T > > >::type x)
Definition: seq_view.hpp:161
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:145
seq_view(typename pass_type< Eigen::Matrix< S, Eigen::Dynamic, Eigen::Dynamic > >::type x)
Definition: seq_view.hpp:102
seq_view(typename pass_type< std::vector< T > >::type x)
Definition: seq_view.hpp:141
pass_type< T >::type operator[](int n) const
Definition: seq_view.hpp:51

     [ Stan Home Page ] © 2011–2014, Stan Development Team.