/*
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
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 */