Skip to content

Instantly share code, notes, and snippets.

@yohhoy
Created March 4, 2023 14:38
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save yohhoy/452a3c5d9132182f409df49f3b541028 to your computer and use it in GitHub Desktop.
Save yohhoy/452a3c5d9132182f409df49f3b541028 to your computer and use it in GitHub Desktop.
mdspan constructors & deduction guides
#include <cassert>
#include <array>
#include <span>
#if 1
#include <https://raw.githubusercontent.com/kokkos/mdspan/single-header/mdspan.hpp>
using namespace std::experimental;
#else
#include <mdspan>
using namespace std;
#endif
int main()
{
int* ptr = new int[6];
using dimNx3 = mdspan<int, extents<size_t, dynamic_extent, 3>>;
using dimNx2x3 = mdspan<int, extents<size_t, dynamic_extent, 2, 3>>;
// Constructor
// http://eel.is/c++draft/mdspan.mdspan.cons
{// mdspan()
dimNx3 m{};
static_assert(m.rank()==2 && m.rank_dynamic()==1);
assert(m.extent(0)==0 && m.extent(1)==3);
}
{// mdspan(data_handle_type, OtherIndexTypes...)
dimNx2x3 ma{ptr, 1, 2, 3}; // N==rank()
static_assert(ma.rank()==3 && ma.rank_dynamic()==1);
assert(ma.extent(0)==1 && ma.extent(1)==2 && ma.extent(2)==3);
dimNx2x3 mb{ptr, 1}; // N==rank_­dynamic()
static_assert(mb.rank()==3 && mb.rank_dynamic()==1);
assert(mb.extent(0)==1 && mb.extent(1)==2 && mb.extent(2)==3);
}
{// mdspan(data_handle_type, span<OtherIndexType, N>);
int exts[] = {1, 2, 3};
dimNx2x3 ma{ptr, std::span{exts}}; // N==rank()
static_assert(ma.rank()==3 && ma.rank_dynamic()==1);
assert(ma.extent(0)==1 && ma.extent(1)==2 && ma.extent(2)==3);
int ext = 1;
dimNx2x3 mb{ptr, std::span<int, 1>{&ext, 1}}; // N==rank_­dynamic()
static_assert(mb.rank()==3 && mb.rank_dynamic()==1);
assert(mb.extent(0)==1 && mb.extent(1)==2 && mb.extent(2)==3);
}
{// mdspan(data_handle_type, const array<OtherIndexType, N>&);
dimNx2x3 ma{ptr, std::array{1, 2, 3}}; // N==rank()
static_assert(ma.rank()==3 && ma.rank_dynamic()==1);
assert(ma.extent(0)==1 && ma.extent(1)==2 && ma.extent(2)==3);
dimNx2x3 mb{ptr, std::array{1}}; // N==rank_­dynamic()
static_assert(mb.rank()==3 && mb.rank_dynamic()==1);
assert(mb.extent(0)==1 && mb.extent(1)==2 && mb.extent(2)==3);
}
{// mdspan(data_handle_type, const extents_type&);
dimNx3 m{ptr, dimNx3::extents_type{2}};
static_assert(m.rank()==2 && m.rank_dynamic()==1);
assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(data_handle_type, const mapping_type&);
dimNx3 m{ptr, dimNx3::mapping_type{}};
static_assert(m.rank()==2 && m.rank_dynamic()==1);
assert(m.extent(0)==0 && m.extent(1)==3);
}
{// mdspan(data_handle_type, const mapping_type&, const accessor_type&);
dimNx3 m{ptr, dimNx3::mapping_type{}, dimNx3::accessor_type{}};
static_assert(m.rank()==2 && m.rank_dynamic()==1);
assert(m.extent(0)==0 && m.extent(1)==3);
}
{// mdspan(const mdspan<...>&);
using src_t = mdspan<int, extents<size_t, 2, 3>, layout_right>;
using dst_t = mdspan<int, dextents<size_t, 2>, layout_stride>;
src_t src{ptr};
dst_t m{src};
static_assert(m.rank()==2 && m.rank_dynamic()==2);
assert(m.extent(0)==2 && m.extent(1)==3);
}
// Deduction Guides
// http://eel.is/c++draft/mdspan.mdspan.overview
{// mdspan(CArray&)
int array[6] = {};
mdspan m{array};
static_assert(m.rank()==1 && m.rank_dynamic()==0);
static_assert(m.extent(0)==6);
}
{// mdspan(Pointer&&)
mdspan m{ptr};
static_assert(m.rank()==0);
}
{// mdspan(ElementType*, Integrals...)
mdspan m{ptr, 2, 3};
static_assert(m.rank()==2 && m.rank_dynamic()==2);
assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(ElementType*, span<OtherIndexType, N>)
int exts[] = {2, 3};
mdspan m{ptr, std::span{exts}};
static_assert(m.rank()==2 && m.rank_dynamic()==2);
assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(ElementType*, const array<OtherIndexType, N>&)
mdspan m{ptr, std::array{2, 3}};
static_assert(m.rank()==2 && m.rank_dynamic()==2);
assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(ElementType*, const extents<IndexType, ExtentsPack...>&)
mdspan m{ptr, extents<size_t, 2, 3>{}};
static_assert(m.rank()==2 && m.rank_dynamic()==0);
static_assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(ElementType*, const MappingType&)
using mapping = layout_left::mapping<extents<size_t, 2, 3>>;
mdspan m{ptr, mapping{}};
static_assert(m.rank()==2 && m.rank_dynamic()==0);
static_assert(m.extent(0)==2 && m.extent(1)==3);
}
{// mdspan(const typename AccessorType::data_handle_type&, const MappingType&, const AccessorType&)
using mapping = layout_left::mapping<extents<size_t, 2, 3>>;
mdspan m{ptr, mapping{}, default_accessor<int>{}};
static_assert(m.rank()==2 && m.rank_dynamic()==0);
static_assert(m.extent(0)==2 && m.extent(1)==3);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment