• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //Copyright (c) 2008-2016 Emil Dotchevski and Reverge Studios, Inc.
2 
3 //Distributed under the Boost Software License, Version 1.0. (See accompanying
4 //file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5 
6 #ifndef BOOST_QVM_7E7AB138196311E0907B246CDFD72085
7 #define BOOST_QVM_7E7AB138196311E0907B246CDFD72085
8 
9 #include <boost/qvm/deduce_scalar.hpp>
10 #include <boost/qvm/vec_traits.hpp>
11 #include <boost/qvm/static_assert.hpp>
12 
13 namespace
14 boost
15     {
16     namespace
17     qvm
18         {
19         template <class T,int D>
20         struct vec;
21 
22         namespace
23         qvm_detail
24             {
25             template <class V,int D,
26                 int VD=vec_traits<V>::dim>
27             struct
28             deduce_vec_default
29                 {
30                 typedef vec<typename vec_traits<V>::scalar_type,D> type;
31                 };
32 
33             template <class V,int D>
34             struct
35             deduce_vec_default<V,D,D>
36                 {
37                 typedef V type;
38                 };
39             }
40 
41         template <class V,int Dim=vec_traits<V>::dim>
42         struct
43         deduce_vec
44             {
45             BOOST_QVM_STATIC_ASSERT(is_vec<V>::value);
46             typedef typename qvm_detail::deduce_vec_default<V,Dim>::type type;
47             };
48 
49         namespace
50         qvm_detail
51             {
52             template <class A,class B,int D,
53                 bool VA=is_vec<A>::value,
54                 bool VB=is_vec<B>::value,
55                 int AD=vec_traits<A>::dim,
56                 int BD=vec_traits<B>::dim>
57             struct
58             deduce_v2_default
59                 {
60                 typedef vec<
61                     typename deduce_scalar<
62                         typename scalar<A>::type,
63                         typename scalar<B>::type>::type,
64                     D> type;
65                 };
66 
67             template <class V,int D>
68             struct
69             deduce_v2_default<V,V,D,true,true,D,D>
70                 {
71                 typedef V type;
72                 };
73             }
74 
75         template <class A,class B,int D>
76         struct
77         deduce_vec2
78             {
79             BOOST_QVM_STATIC_ASSERT(is_vec<A>::value || is_vec<B>::value);
80             typedef typename qvm_detail::deduce_v2_default<A,B,D>::type type;
81             };
82         }
83     }
84 
85 #endif
86