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

source code of boost/libs/qvm/include/boost/qvm/deduce_vec.hpp