//---------------------------------------------------------------------------// // Copyright (c) 2013-2014 Kyle Lutz // // 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 #include #include #ifndef BOOST_COMPUTE_NO_HDR_INITIALIZER_LIST #include #endif #include namespace boost { namespace compute { /// The extents class contains an array of n-dimensional extents. /// /// \see dim() template class extents { public: typedef size_t size_type; static const size_type static_size = N; typedef boost::array 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 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() ); } /// 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