1///////////////////////////////////////////////////////////////////////////////////
2/// OpenGL Mathematics (glm.g-truc.net)
3///
4/// Copyright (c) 2005 - 2014 G-Truc Creation (www.g-truc.net)
5/// Permission is hereby granted, free of charge, to any person obtaining a copy
6/// of this software and associated documentation files (the "Software"), to deal
7/// in the Software without restriction, including without limitation the rights
8/// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9/// copies of the Software, and to permit persons to whom the Software is
10/// furnished to do so, subject to the following conditions:
11///
12/// The above copyright notice and this permission notice shall be included in
13/// all copies or substantial portions of the Software.
14///
15/// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16/// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17/// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18/// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19/// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20/// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21/// THE SOFTWARE.
22///
23/// @ref core
24/// @file glm/core/type_gentype.hpp
25/// @date 2008-10-05 / 2011-06-15
26/// @author Christophe Riccio
27///////////////////////////////////////////////////////////////////////////////////
28
29#ifndef glm_core_type_gentype
30#define glm_core_type_gentype
31
32namespace glm
33{
34	enum profile
35	{
36		nice,
37		fast,
38		simd
39	};
40
41	typedef std::size_t sizeType;
42
43namespace detail
44{
45	template
46	<
47		typename VALTYPE,
48		template <typename> class TYPE
49	>
50	struct genType
51	{
52	public:
53		enum ctor{null};
54
55		typedef VALTYPE value_type;
56		typedef VALTYPE & value_reference;
57		typedef VALTYPE * value_pointer;
58		typedef VALTYPE const * value_const_pointer;
59		typedef TYPE<bool> bool_type;
60
61		typedef sizeType size_type;
62		static bool is_vector();
63		static bool is_matrix();
64
65		typedef TYPE<VALTYPE> type;
66		typedef TYPE<VALTYPE> * pointer;
67		typedef TYPE<VALTYPE> const * const_pointer;
68		typedef TYPE<VALTYPE> const * const const_pointer_const;
69		typedef TYPE<VALTYPE> * const pointer_const;
70		typedef TYPE<VALTYPE> & reference;
71		typedef TYPE<VALTYPE> const & const_reference;
72		typedef TYPE<VALTYPE> const & param_type;
73
74		//////////////////////////////////////
75		// Address (Implementation details)
76
77		value_const_pointer value_address() const{return value_pointer(this);}
78		value_pointer value_address(){return value_pointer(this);}
79
80	//protected:
81	//	enum kind
82	//	{
83	//		GEN_TYPE,
84	//		VEC_TYPE,
85	//		MAT_TYPE
86	//	};
87
88	//	typedef typename TYPE::kind kind;
89	};
90
91	template
92	<
93		typename VALTYPE,
94		template <typename> class TYPE
95	>
96	bool genType<VALTYPE, TYPE>::is_vector()
97	{
98		return true;
99	}
100/*
101	template <typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice>
102	class base
103	{
104	public:
105		//////////////////////////////////////
106		// Traits
107
108		typedef sizeType							size_type;
109		typedef valTypeT							value_type;
110
111		typedef base<value_type, colT, rowT>		class_type;
112
113		typedef base<bool, colT, rowT>				bool_type;
114		typedef base<value_type, rowT, 1>			col_type;
115		typedef base<value_type, colT, 1>			row_type;
116		typedef base<value_type, rowT, colT>		transpose_type;
117
118		static size_type							col_size();
119		static size_type							row_size();
120		static size_type							value_size();
121		static bool									is_scalar();
122		static bool									is_vector();
123		static bool									is_matrix();
124
125	private:
126		// Data
127		col_type value[colT];
128
129	public:
130		//////////////////////////////////////
131		// Constructors
132		base();
133		base(class_type const & m);
134
135		explicit base(T const & x);
136		explicit base(value_type const * const x);
137		explicit base(col_type const * const x);
138
139		//////////////////////////////////////
140		// Conversions
141		template <typename vU, uint cU, uint rU, profile pU>
142		explicit base(base<vU, cU, rU, pU> const & m);
143
144		//////////////////////////////////////
145		// Accesses
146		col_type& operator[](size_type i);
147		col_type const & operator[](size_type i) const;
148
149		//////////////////////////////////////
150		// Unary updatable operators
151		class_type& operator=  (class_type const & x);
152		class_type& operator+= (T const & x);
153		class_type& operator+= (class_type const & x);
154		class_type& operator-= (T const & x);
155		class_type& operator-= (class_type const & x);
156		class_type& operator*= (T const & x);
157		class_type& operator*= (class_type const & x);
158		class_type& operator/= (T const & x);
159		class_type& operator/= (class_type const & x);
160		class_type& operator++ ();
161		class_type& operator-- ();
162	};
163*/
164
165	//template <typename T>
166	//struct traits
167	//{
168	//	static const bool is_signed = false;
169	//	static const bool is_float = false;
170	//	static const bool is_vector = false;
171	//	static const bool is_matrix = false;
172	//	static const bool is_genType = false;
173	//	static const bool is_genIType = false;
174	//	static const bool is_genUType = false;
175	//};
176
177	//template <>
178	//struct traits<half>
179	//{
180	//	static const bool is_float = true;
181	//	static const bool is_genType = true;
182	//};
183
184	//template <>
185	//struct traits<float>
186	//{
187	//	static const bool is_float = true;
188	//	static const bool is_genType = true;
189	//};
190
191	//template <>
192	//struct traits<double>
193	//{
194	//	static const bool is_float = true;
195	//	static const bool is_genType = true;
196	//};
197
198	//template <typename genType>
199	//struct desc
200	//{
201	//	typedef genType							type;
202	//	typedef genType *						pointer;
203	//	typedef genType const*					const_pointer;
204	//	typedef genType const *const			const_pointer_const;
205	//	typedef genType *const					pointer_const;
206	//	typedef genType &						reference;
207	//	typedef genType const&					const_reference;
208	//	typedef genType const&					param_type;
209
210	//	typedef typename genType::value_type	value_type;
211	//	typedef typename genType::size_type		size_type;
212	//	static const typename size_type			value_size;
213	//};
214
215	//template <typename genType>
216	//const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size();
217
218}//namespace detail
219}//namespace glm
220
221//#include "type_gentype.inl"
222
223#endif//glm_core_type_gentype
224