/* Copyright (C) 2012 fmaj7b5.info This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #ifndef FM7b5_MDVIEW_CUH #define FM7b5_MDVIEW_CUH #include #include namespace FM7b5 { namespace detail { //! copy const qualifier of From to To template struct copy_const { typedef To type; }; template struct copy_const { typedef typename std::add_const::type type; }; //! array subscript access for multi dimentional data template class MDView { public: typedef T value_type; typedef typename copy_const::type* byte_pointer_type; typedef typename copy_const::type* void_pointer_type; protected: //! temporal class for resolving the operator[] template class ref { byte_pointer_type const m_p; const size_t* const m_extent; public: typedef ref result_type; __device__ ref(void_pointer_type p, const size_t* extent) : m_p(static_cast(p)), m_extent(extent) {} __device__ result_type operator[](size_t i) const { return result_type(m_p + *m_extent * i, m_extent + 1); } }; template class ref { byte_pointer_type const m_p; const size_t* const m_extent; public: typedef typename std::add_reference::type result_type; __device__ ref(void_pointer_type p, const size_t* extent) : m_p(static_cast(p)), m_extent(extent) {} __device__ result_type operator[](size_t i) const { return *reinterpret_cast(m_p + *m_extent * i); } }; byte_pointer_type m_data; size_t m_extent[D]; public: MDView() {} MDView(void_pointer_type p, const size_t extent[D]) : m_data(static_cast(p)) { for (size_t i = 0; i < D; ++i) { m_extent[i] = extent[i]; } } __device__ typename ref::result_type operator[](size_t i) const { ref r(m_data, m_extent); return r[i]; } }; } using detail::MDView; } #endif /* FM7b5_MDVIEW_CUH */