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
							 |