TooN
reference.hh
1 // -*- c++ -*-
2 
3 // Copyright (C) 2009 Tom Drummond (twd20@cam.ac.uk),
4 // Ed Rosten (er258@cam.ac.uk)
5 
6 //All rights reserved.
7 //
8 //Redistribution and use in source and binary forms, with or without
9 //modification, are permitted provided that the following conditions
10 //are met:
11 //1. Redistributions of source code must retain the above copyright
12 // notice, this list of conditions and the following disclaimer.
13 //2. Redistributions in binary form must reproduce the above copyright
14 // notice, this list of conditions and the following disclaimer in the
15 // documentation and/or other materials provided with the distribution.
16 //
17 //THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND OTHER CONTRIBUTORS ``AS IS''
18 //AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 //IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 //ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR OTHER CONTRIBUTORS BE
21 //LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22 //CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23 //SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 //INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25 //CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26 //ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 //POSSIBILITY OF SUCH DAMAGE.
28 
29 namespace TooN {
30 
32 //
33 // Helper classes for matrices constructed as references to foreign data
34 //
35 
36 struct Reference
37 {
38 
39  template<int Size, typename Precision>
40  struct VLayout
41  : public Internal::GenericVBase<Size, Precision, 1, Internal::VectorSlice<Size, Precision> >
42  {
43 
44  VLayout(Precision* p, int sz=0)
46  {}
47  };
48 
49 
50  struct RowMajor
51  {
52  template<int Rows, int Cols, class Precision>
53  struct MLayout
54  : public Internal::GenericMBase<Rows, Cols, Precision, (Cols==-1?-2:Cols), 1, Internal::MatrixSlice<Rows, Cols, Precision> >
55  {
56 
57  MLayout(Precision* p)
58  : Internal::GenericMBase<Rows,Cols,Precision, (Cols==-1?-2:Cols), 1, Internal::MatrixSlice<Rows, Cols, Precision> > (p)
59  {}
60  MLayout(Precision* p, int r, int c)
61  : Internal::GenericMBase<Rows,Cols,Precision, (Cols==-1?-2:Cols), 1, Internal::MatrixSlice<Rows, Cols, Precision> > (p, r, c, 0, 0)
62  {}
63  };
64  };
65 
66  struct ColMajor
67  {
68  template<int Rows, int Cols, class Precision> struct MLayout: public Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows==-1?-2:Rows), Internal::MatrixSlice<Rows, Cols, Precision> >
69  {
70  MLayout(Precision* p)
71  : Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows==-1?-2:Rows), Internal::MatrixSlice<Rows, Cols, Precision> >(p)
72  {}
73  MLayout(Precision* p, int r, int c)
74  : Internal::GenericMBase<Rows, Cols, Precision, 1, (Rows==-1?-2:Rows), Internal::MatrixSlice<Rows, Cols, Precision> >(p, r, c, 0, 0)
75  {}
76  };
77  };
78 };
79 
80 
81  inline Vector<Dynamic, double, Reference> wrapVector(double* data, int size) { return Vector<Dynamic, double, Reference>(data, size); }
82  inline const Vector<Dynamic, const double, Reference> wrapVector(const double* data, int size) { return Vector<Dynamic, const double, Reference>(data, size); }
83 template<int Size> inline Vector<Size, double, Reference> wrapVector(double* data) { return Vector<Size, double, Reference>(data); }
84 template<int Size> inline const Vector<Size, const double, Reference> wrapVector(const double* data) { return Vector<Size, const double, Reference>(data); }
85 template<class Precision> inline Vector<Dynamic, Precision, Reference> wrapVector(Precision* data, int size) { return Vector<Dynamic, Precision, Reference>(data, size); }
86 template<class Precision> inline const Vector<Dynamic, const Precision, Reference> wrapVector(const Precision* data, int size) { return Vector<Dynamic, const Precision, Reference>(data, size); }
87 template<int Size, class Precision> inline Vector<Size, Precision, Reference> wrapVector(Precision* data) { return Vector<Size, Precision, Reference>(data); }
88 template<int Size, class Precision> inline const Vector<Size, const Precision, Reference> wrapVector(const Precision* data) { return Vector<Size, const Precision, Reference>(data); }
89 
95 //Fully static matrices, ie no size parameters
97 template<int Rows, int Cols> inline const Matrix<Rows, Cols, const double, Reference::RowMajor> wrapMatrix(const double* data) { return Matrix<Rows, Cols, const double, Reference::RowMajor>(data);}
98 template<int Rows, int Cols, class Precision> inline Matrix<Rows, Cols, Precision, Reference::RowMajor> wrapMatrix(Precision* data) { return Matrix<Rows, Cols, Precision, Reference::RowMajor>(data);}
99 template<int Rows, int Cols, class Precision> inline const Matrix<Rows, Cols, const Precision, Reference::RowMajor> wrapMatrix(const Precision* data) { return Matrix<Rows, Cols, const Precision, Reference::RowMajor>(data);}
100 //Static sizes with size parameters (useful for half-dynamic matrices)
101 template<int Rows, int Cols> inline Matrix<Rows, Cols, double, Reference::RowMajor> wrapMatrix(double* data, int rows, int cols) { return Matrix<Rows, Cols, double, Reference::RowMajor>(data, rows, cols);}
102 template<int Rows, int Cols> inline const Matrix<Rows, Cols, const double, Reference::RowMajor> wrapMatrix(const double* data, int rows, int cols) { return Matrix<Rows, Cols, const double, Reference::RowMajor>(data, rows, cols);}
103 template<int Rows, int Cols, class Precision> inline Matrix<Rows, Cols, Precision, Reference::RowMajor> wrapMatrix(Precision* data, int rows, int cols) { return Matrix<Rows, Cols, Precision, Reference::RowMajor>(data, rows, cols);}
104 template<int Rows, int Cols, class Precision> inline const Matrix<Rows, Cols, const Precision, Reference::RowMajor> wrapMatrix(const Precision* data, int rows, int cols) { return Matrix<Rows, Cols, const Precision, Reference::RowMajor>(data, rows, cols);}
105 //Fully dynamic
106  inline Matrix<Dynamic, Dynamic, double, Reference::RowMajor> wrapMatrix(double* data, int rows, int cols) { return Matrix<Dynamic, Dynamic, double, Reference::RowMajor>(data, rows, cols);}
107  inline const Matrix<Dynamic, Dynamic, const double, Reference::RowMajor> wrapMatrix(const double* data, int rows, int cols) { return Matrix<Dynamic, Dynamic, const double, Reference::RowMajor>(data, rows, cols);}
108 template<class Precision> inline Matrix<Dynamic, Dynamic, Precision, Reference::RowMajor> wrapMatrix(Precision* data, int rows, int cols) { return Matrix<Dynamic, Dynamic, Precision, Reference::RowMajor>(data, rows, cols);}
109 template<class Precision> inline const Matrix<Dynamic, Dynamic, const Precision, Reference::RowMajor> wrapMatrix(const Precision* data, int rows, int cols) { return Matrix<Dynamic, Dynamic, const Precision, Reference::RowMajor>(data, rows, cols);}
111 }
Definition: vbase.hh:32
Pretty generic SFINAE introspection generator.
Definition: vec_test.cc:21
Definition: reference.hh:40
A vector.
Definition: vector.hh:126
Matrix< Rows, Cols, double, Reference::RowMajor > wrapMatrix(double *data)
Wrap external data as a Matrix As usual, if template sizes are provided, then the run-time size is o...
Definition: reference.hh:96
Definition: reference.hh:53
Definition: reference.hh:66
A matrix.
Definition: matrix.hh:105
Definition: reference.hh:68
Definition: reference.hh:50
Definition: mbase.hh:37
Definition: reference.hh:36