You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
3.8 KiB
164 lines
3.8 KiB
//---------------------------------------------------------------------------// |
|
// 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_UTILITY_EXTENTS_HPP |
|
#define BOOST_COMPUTE_UTILITY_EXTENTS_HPP |
|
|
|
#include <functional> |
|
#include <numeric> |
|
|
|
#include <boost/compute/config.hpp> |
|
|
|
#ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST |
|
#include <initializer_list> |
|
#endif |
|
|
|
#include <boost/array.hpp> |
|
|
|
namespace boost { |
|
namespace compute { |
|
|
|
/// The extents class contains an array of n-dimensional extents. |
|
/// |
|
/// \see dim() |
|
template<size_t N> |
|
class extents |
|
{ |
|
public: |
|
typedef size_t size_type; |
|
static const size_type static_size = N; |
|
typedef boost::array<size_t, N> array_type; |
|
typedef typename array_type::iterator iterator; |
|
typedef typename array_type::const_iterator const_iterator; |
|
|
|
/// Creates an extents object with each component set to zero. |
|
/// |
|
/// For example: |
|
/// \code |
|
/// extents<3> exts(); // (0, 0, 0) |
|
/// \endcode |
|
extents() |
|
{ |
|
m_extents.fill(0); |
|
} |
|
|
|
/// Creates an extents object with each component set to \p value. |
|
/// |
|
/// For example: |
|
/// \code |
|
/// extents<3> exts(1); // (1, 1, 1) |
|
/// \endcode |
|
explicit extents(size_t value) |
|
{ |
|
m_extents.fill(value); |
|
} |
|
|
|
#ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST |
|
/// Creates an extents object with \p values. |
|
extents(std::initializer_list<size_t> values) |
|
{ |
|
BOOST_ASSERT(values.size() == N); |
|
|
|
std::copy(values.begin(), values.end(), m_extents.begin()); |
|
} |
|
#endif // BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST |
|
|
|
/// Returns the size (i.e. dimensionality) of the extents array. |
|
size_type size() const |
|
{ |
|
return N; |
|
} |
|
|
|
/// Returns the linear size of the extents. This is equivalent to the |
|
/// product of each extent in each dimension. |
|
size_type linear() const |
|
{ |
|
return std::accumulate( |
|
m_extents.begin(), m_extents.end(), 1, std::multiplies<size_type>() |
|
); |
|
} |
|
|
|
/// Returns a pointer to the extents data array. |
|
/// |
|
/// This is useful for passing the extents data to OpenCL APIs which |
|
/// expect an array of \c size_t. |
|
size_t* data() |
|
{ |
|
return m_extents.data(); |
|
} |
|
|
|
/// \overload |
|
const size_t* data() const |
|
{ |
|
return m_extents.data(); |
|
} |
|
|
|
iterator begin() |
|
{ |
|
return m_extents.begin(); |
|
} |
|
|
|
const_iterator begin() const |
|
{ |
|
return m_extents.begin(); |
|
} |
|
|
|
const_iterator cbegin() const |
|
{ |
|
return m_extents.cbegin(); |
|
} |
|
|
|
iterator end() |
|
{ |
|
return m_extents.end(); |
|
} |
|
|
|
const_iterator end() const |
|
{ |
|
return m_extents.end(); |
|
} |
|
|
|
const_iterator cend() const |
|
{ |
|
return m_extents.cend(); |
|
} |
|
|
|
/// Returns a reference to the extent at \p index. |
|
size_t& operator[](size_t index) |
|
{ |
|
return m_extents[index]; |
|
} |
|
|
|
/// \overload |
|
const size_t& operator[](size_t index) const |
|
{ |
|
return m_extents[index]; |
|
} |
|
|
|
/// Returns \c true if the extents in \c *this are the same as \p other. |
|
bool operator==(const extents &other) const |
|
{ |
|
return m_extents == other.m_extents; |
|
} |
|
|
|
/// Returns \c true if the extents in \c *this are not the same as \p other. |
|
bool operator!=(const extents &other) const |
|
{ |
|
return m_extents != other.m_extents; |
|
} |
|
|
|
private: |
|
array_type m_extents; |
|
}; |
|
|
|
} // end compute namespace |
|
} // end boost namespace |
|
|
|
#endif // BOOST_COMPUTE_UTILITY_EXTENTS_HPP
|
|
|