vmmlib  1.7.0
 All Classes Namespaces Functions Pages
vector_traits.hpp
1 /*
2  * Copyright (c) 2006-2014, Visualization and Multimedia Lab,
3  * University of Zurich <http://vmml.ifi.uzh.ch>,
4  * Eyescale Software GmbH,
5  * Blue Brain Project, EPFL
6  *
7  * This file is part of VMMLib <https://github.com/VMML/vmmlib/>
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted provided that the following conditions are met:
11  *
12  * Redistributions of source code must retain the above copyright notice, this
13  * list of conditions and the following disclaimer. Redistributions in binary
14  * form must reproduce the above copyright notice, this list of conditions and
15  * the following disclaimer in the documentation and/or other materials provided
16  * with the distribution. Neither the name of the Visualization and Multimedia
17  * Lab, University of Zurich nor the names of its contributors may be used to
18  * endorse or promote products derived from this software without specific prior
19  * written permission.
20  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
24  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
25  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
26  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
27  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
28  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
29  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
30  * POSSIBILITY OF SUCH DAMAGE.
31  */
32 #ifndef __VMML_VECTOR_TRAITS_HPP__
33 #define __VMML_VECTOR_TRAITS_HPP__
34 
35 #include <vmmlib/vector.hpp>
36 #include <boost/la/vector_traits.hpp>
37 
38 namespace boost
39 {
40 namespace la
41 {
42 
43 template<size_t M, typename T>
44 struct vector_traits<vmml::vector<M, T> >
45 {
47 
48  static const int dim = M;
49 
50  typedef T scalar_type;
51 
52  template<int I>
53  static scalar_type r(const vector_type& v)
54  {
55  BOOST_STATIC_ASSERT(I >= 0);
56  BOOST_STATIC_ASSERT(I < dim);
57  return v.array[I];
58  }
59 
60  template<int I>
61  static scalar_type& w(vector_type& v)
62  {
63  BOOST_STATIC_ASSERT(I >= 0);
64  BOOST_STATIC_ASSERT(I < dim);
65  return v.array[I];
66  }
67 
68  static scalar_type ir(int i, const vector_type& v)
69  {
70  BOOST_ASSERT(i >= 0);
71  BOOST_ASSERT(i < dim);
72  return v.array[i];
73  }
74 
75  static scalar_type& iw(int i, vector_type& v)
76  {
77  BOOST_ASSERT(i >= 0);
78  BOOST_ASSERT(i < dim);
79  return v.array[i];
80  }
81 };
82 
83 } // namespace la
84 } // namespace boost
85 
86 #endif /* VMML_VECTOR_TRAITS_HPP */
87