173 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			173 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | //---------------------------------------------------------------------------// | ||
|  | // Copyright (c) 2013-2014 Kyle Lutz <kyle.r.lutz@gmail.com> | ||
|  | // | ||
|  | // Distributed under the Boost Software License, Version 1.0 | ||
|  | // See accompanying file LICENSE_1_0.txt or copy at | ||
|  | // http://www.boost.org/LICENSE_1_0.txt | ||
|  | // | ||
|  | // See http://boostorg.github.com/compute for more information. | ||
|  | //---------------------------------------------------------------------------// | ||
|  | 
 | ||
|  | #ifndef BOOST_COMPUTE_TYPES_FUNDAMENTAL_HPP | ||
|  | #define BOOST_COMPUTE_TYPES_FUNDAMENTAL_HPP | ||
|  | 
 | ||
|  | #include <cstring> | ||
|  | #include <ostream> | ||
|  | 
 | ||
|  | #include <boost/preprocessor/cat.hpp> | ||
|  | #include <boost/preprocessor/comma.hpp> | ||
|  | #include <boost/preprocessor/repetition.hpp> | ||
|  | #include <boost/preprocessor/stringize.hpp> | ||
|  | 
 | ||
|  | #include <boost/compute/cl.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace compute { | ||
|  | 
 | ||
|  | // scalar data types | ||
|  | typedef cl_char char_; | ||
|  | typedef cl_uchar uchar_; | ||
|  | typedef cl_short short_; | ||
|  | typedef cl_ushort ushort_; | ||
|  | typedef cl_int int_; | ||
|  | typedef cl_uint uint_; | ||
|  | typedef cl_long long_; | ||
|  | typedef cl_ulong ulong_; | ||
|  | typedef cl_float float_; | ||
|  | typedef cl_double double_; | ||
|  | 
 | ||
|  | // converts uchar to ::boost::compute::uchar_ | ||
|  | #define BOOST_COMPUTE_MAKE_SCALAR_TYPE(scalar) \ | ||
|  |     BOOST_PP_CAT(::boost::compute::scalar, _) | ||
|  | 
 | ||
|  | // converts float, 4 to ::boost::compute::float4_ | ||
|  | #define BOOST_COMPUTE_MAKE_VECTOR_TYPE(scalar, size) \ | ||
|  |     BOOST_PP_CAT(BOOST_PP_CAT(::boost::compute::scalar, size), _) | ||
|  | 
 | ||
|  | // vector data types | ||
|  | template<class Scalar, size_t N> | ||
|  | class vector_type | ||
|  | { | ||
|  | public: | ||
|  |     typedef Scalar scalar_type; | ||
|  | 
 | ||
|  |     vector_type() | ||
|  |     { | ||
|  | 
 | ||
|  |     } | ||
|  | 
 | ||
|  |     explicit vector_type(const Scalar scalar) | ||
|  |     { | ||
|  |         for(size_t i = 0; i < N; i++) | ||
|  |             m_value[i] = scalar; | ||
|  |     } | ||
|  | 
 | ||
|  |     vector_type(const vector_type<Scalar, N> &other) | ||
|  |     { | ||
|  |         std::memcpy(m_value, other.m_value, sizeof(m_value)); | ||
|  |     } | ||
|  | 
 | ||
|  |     vector_type<Scalar, N>& | ||
|  |     operator=(const vector_type<Scalar, N> &other) | ||
|  |     { | ||
|  |         std::memcpy(m_value, other.m_value, sizeof(m_value)); | ||
|  |         return *this; | ||
|  |     } | ||
|  | 
 | ||
|  |     size_t size() const | ||
|  |     { | ||
|  |         return N; | ||
|  |     } | ||
|  | 
 | ||
|  |     Scalar& operator[](size_t i) | ||
|  |     { | ||
|  |         return m_value[i]; | ||
|  |     } | ||
|  | 
 | ||
|  |     Scalar operator[](size_t i) const | ||
|  |     { | ||
|  |         return m_value[i]; | ||
|  |     } | ||
|  | 
 | ||
|  |     bool operator==(const vector_type<Scalar, N> &other) const | ||
|  |     { | ||
|  |         return std::memcmp(m_value, other.m_value, sizeof(m_value)) == 0; | ||
|  |     } | ||
|  | 
 | ||
|  |     bool operator!=(const vector_type<Scalar, N> &other) const | ||
|  |     { | ||
|  |         return !(*this == other); | ||
|  |     } | ||
|  | 
 | ||
|  | protected: | ||
|  |     scalar_type m_value[N]; | ||
|  | }; | ||
|  | 
 | ||
|  | #define BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION(z, i, _) \ | ||
|  |     BOOST_PP_COMMA_IF(i) scalar_type BOOST_PP_CAT(arg, i) | ||
|  | #define BOOST_COMPUTE_VECTOR_TYPE_DECLARE_CTOR_ARGS(scalar, size) \ | ||
|  |     BOOST_PP_REPEAT(size, BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION, _) | ||
|  | #define BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_ARG(z, i, _) \ | ||
|  |     m_value[i] = BOOST_PP_CAT(arg, i); | ||
|  | #define BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_SINGLE_ARG(z, i, _) \ | ||
|  |     m_value[i] = arg; | ||
|  | 
 | ||
|  | #define BOOST_COMPUTE_DECLARE_VECTOR_TYPE_CLASS(cl_scalar, size, class_name) \ | ||
|  |     class class_name : public vector_type<cl_scalar, size> \ | ||
|  |     { \ | ||
|  |     public: \ | ||
|  |         class_name() { } \ | ||
|  |         explicit class_name( scalar_type arg ) \ | ||
|  |         { \ | ||
|  |             BOOST_PP_REPEAT(size, BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_SINGLE_ARG, _) \ | ||
|  |         } \ | ||
|  |         class_name( \ | ||
|  |             BOOST_PP_REPEAT(size, BOOST_COMPUTE_VECTOR_TYPE_CTOR_ARG_FUNCTION, _) \ | ||
|  |         ) \ | ||
|  |         { \ | ||
|  |           BOOST_PP_REPEAT(size, BOOST_COMPUTE_VECTOR_TYPE_ASSIGN_CTOR_ARG, _) \ | ||
|  |         } \ | ||
|  |     }; | ||
|  | 
 | ||
|  | #define BOOST_COMPUTE_DECLARE_VECTOR_TYPE(scalar, size) \ | ||
|  |     BOOST_COMPUTE_DECLARE_VECTOR_TYPE_CLASS(BOOST_PP_CAT(cl_, scalar), \ | ||
|  |                                             size, \ | ||
|  |                                             BOOST_PP_CAT(BOOST_PP_CAT(scalar, size), _)) \ | ||
|  |     \ | ||
|  |     inline std::ostream& operator<<( \ | ||
|  |         std::ostream &s, \ | ||
|  |         const BOOST_COMPUTE_MAKE_VECTOR_TYPE(scalar, size) &v) \ | ||
|  |     { \ | ||
|  |         s << BOOST_PP_STRINGIZE(BOOST_PP_CAT(scalar, size)) << "("; \ | ||
|  |         for(size_t i = 0; i < size; i++){\ | ||
|  |             s << v[i]; \ | ||
|  |             if(i != size - 1){\ | ||
|  |                 s << ", "; \ | ||
|  |             } \ | ||
|  |         } \ | ||
|  |         s << ")"; \ | ||
|  |         return s; \ | ||
|  |     } | ||
|  | 
 | ||
|  | #define BOOST_COMPUTE_DECLARE_VECTOR_TYPES(scalar) \ | ||
|  |     BOOST_COMPUTE_DECLARE_VECTOR_TYPE(scalar, 2) \ | ||
|  |     BOOST_COMPUTE_DECLARE_VECTOR_TYPE(scalar, 4) \ | ||
|  |     BOOST_COMPUTE_DECLARE_VECTOR_TYPE(scalar, 8) \ | ||
|  |     BOOST_COMPUTE_DECLARE_VECTOR_TYPE(scalar, 16) \ | ||
|  | 
 | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(char) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(uchar) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(short) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(ushort) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(int) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(uint) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(long) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(ulong) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(float) | ||
|  | BOOST_COMPUTE_DECLARE_VECTOR_TYPES(double) | ||
|  | 
 | ||
|  | } // end compute namespace | ||
|  | } // end boost namespace | ||
|  | 
 | ||
|  | #endif // BOOST_COMPUTE_TYPES_FUNDAMENTAL_HPP |