-
Notifications
You must be signed in to change notification settings - Fork 39
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Squashed 'externals/coda-oss/' changes from df4e0fc1f..28926b673
28926b673 provide our own (simple) mdspan implementation (#759) 6bb722454 make SpanRC API match std::mdspan (#758) git-subtree-dir: externals/coda-oss git-subtree-split: 28926b673931c3f148882ceca7d3de203accfa4e
- Loading branch information
Dan Smith
committed
Dec 1, 2023
1 parent
ce6eb2f
commit f5abe98
Showing
12 changed files
with
311 additions
and
98 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,73 @@ | ||
/* ========================================================================= | ||
* This file is part of coda_oss-c++ | ||
* ========================================================================= | ||
* | ||
* (C) Copyright 2004 - 2014, MDA Information Systems LLC | ||
* © Copyright 2023, Maxar Technologies, Inc. | ||
* | ||
* coda_oss-c++ is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU Lesser General Public License as published by | ||
* the Free Software Foundation; either version 3 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 Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this program; If not, | ||
* see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
#pragma once | ||
|
||
#include "coda_oss/CPlusPlus.h" | ||
|
||
// This should always work ... it's in a `details` namespace | ||
#include "coda_oss/mdspan_.h" | ||
|
||
// This logic needs to be here rather than <std/mdspan> so that `coda_oss::mdspan` will | ||
// be the same as `std::mdspan`. | ||
#ifndef CODA_OSS_HAVE_std_mdspan_ | ||
#define CODA_OSS_HAVE_std_mdspan_ 0 // assume no <mdspan> | ||
#endif | ||
#ifndef CODA_OSS_HAVE_experimental_mdspan_ | ||
#define CODA_OSS_HAVE_experimental_mdspan_ 0 // assume no std::experimental::mdspan | ||
#endif | ||
#if CODA_OSS_cpp17 // __has_include | ||
#if __has_include(<mdspan>) // <mdspan> not until C++23 | ||
#include <mdspan> | ||
#undef CODA_OSS_HAVE_std_mdspan_ | ||
#define CODA_OSS_HAVE_std_mdspan_ 1 // provided by the implementation, probably C++23 | ||
#endif | ||
|
||
#if CODA_OSS_cpp20 // Can't even #include this file with older C++14/17 compilers! :-( | ||
// Put this in a __has_include so that it's optional. Our simple implemtnation works | ||
// for our needs, and this brings along a lot of code that our older compilers don't | ||
// like. By the time we need more functionality, maybe we'll be using C++23? | ||
// | ||
// Until then, having this available allows checking our implementation against | ||
// something much more real. https://github.com/kokkos/mdspan | ||
#if __has_include("coda_oss/experimental/mdspan") | ||
#include "coda_oss/experimental/mdspan" | ||
#undef CODA_OSS_HAVE_experimental_mdspan_ | ||
#define CODA_OSS_HAVE_experimental_mdspan_ 1 // provided coda_oss/experimental/mdspan | ||
#endif | ||
#endif | ||
#endif // CODA_OSS_cpp17 | ||
|
||
namespace coda_oss | ||
{ | ||
#if CODA_OSS_HAVE_std_mdspan_ | ||
using std::mdspan; | ||
using std::dextents; | ||
#elif CODA_OSS_HAVE_experimental_mdspan_ | ||
using std::experimental::mdspan; | ||
using std::experimental::dextents; | ||
#else | ||
using details::mdspan; | ||
using details::dextents; | ||
#endif | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,151 @@ | ||
/* ========================================================================= | ||
* This file is part of coda_oss-c++ | ||
* ========================================================================= | ||
* | ||
* (C) Copyright 2004 - 2014, MDA Information Systems LLC | ||
* © Copyright 2023, Maxar Technologies, Inc. | ||
* | ||
* coda_oss-c++ is free software; you can redistribute it and/or modify | ||
* it under the terms of the GNU Lesser General Public License as published by | ||
* the Free Software Foundation; either version 3 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 Lesser General Public License for more details. | ||
* | ||
* You should have received a copy of the GNU Lesser General Public | ||
* License along with this program; If not, | ||
* see <http://www.gnu.org/licenses/>. | ||
* | ||
*/ | ||
#pragma once | ||
|
||
#include <assert.h> | ||
|
||
#include <array> | ||
|
||
#include "coda_oss/span.h" | ||
|
||
// This is a simple, partial, and incomplete implementation of `std::mdspan` (in C++23). | ||
// https://en.cppreference.com/w/cpp/container/mdspan | ||
// | ||
// Why? Our (current) needs are much more limited than all the use-cases for `std::mdspan`: | ||
// dynamic (not static) extents, rank of 2 (rows × cols), contiguous memory, ... | ||
// By the time we really need more features, maybe we'll be using C++23? | ||
namespace coda_oss | ||
{ | ||
namespace details | ||
{ | ||
// https://en.cppreference.com/w/cpp/container/mdspan/extents | ||
template<typename IndexType, size_t Rank> | ||
struct dextents final // this is actually supposed to be an alias template with all dynamic extents | ||
{ | ||
static_assert(Rank == 2, "Rank must have a value of 2"); | ||
using index_type = IndexType; | ||
using size_type = index_type; | ||
using rank_type = size_t; | ||
|
||
constexpr dextents() = default; | ||
|
||
// These are supposed to be templates, but we don't need that complication right now. | ||
constexpr dextents(index_type i0, index_type i1) noexcept : exts_{i0, i1} | ||
{ | ||
} | ||
constexpr explicit dextents(const std::array<index_type, Rank>& exts) noexcept : exts_(exts) | ||
{ | ||
} | ||
|
||
dextents(const dextents&) = default; | ||
dextents& operator=(const dextents&) = default; | ||
dextents(dextents&&) = default; | ||
dextents& operator=(dextents&&) = default; | ||
|
||
constexpr index_type extent(rank_type r) const noexcept | ||
{ | ||
return exts_[r]; | ||
} | ||
|
||
static constexpr auto rank() noexcept | ||
{ | ||
return Rank; | ||
} | ||
|
||
private: | ||
std::array<index_type, Rank> exts_; | ||
}; | ||
|
||
template<typename T, typename TExtents> | ||
class mdspan final | ||
{ | ||
coda_oss::span<T> s_; // `span` instead of a raw pointer to get more range checking. | ||
TExtents ext_; | ||
|
||
// c.f., `types::RowCol` | ||
template <typename IndexType, size_t Rank> | ||
static size_t area(const dextents<IndexType, Rank>& exts) | ||
{ | ||
return exts.extent(0) * exts.extent(1); | ||
} | ||
|
||
public: | ||
using extents_type = TExtents; | ||
using size_type = typename extents_type::size_type; | ||
using data_handle_type = T*; | ||
using reference = T&; | ||
|
||
constexpr mdspan() = default; | ||
|
||
// Again, these are supposed to be templates ... | ||
mdspan(data_handle_type p, const extents_type& ext) noexcept : s_(p, area(ext)), ext_(ext) | ||
{ | ||
} | ||
mdspan(data_handle_type p, const std::array<size_type, 2>& dims) noexcept : mdspan(p, extents_type(dims)) | ||
{ | ||
} | ||
|
||
mdspan(const mdspan&) = default; | ||
mdspan& operator=(const mdspan&) = default; | ||
mdspan(mdspan&&) = default; | ||
mdspan& operator=(mdspan&&) = default; | ||
|
||
constexpr data_handle_type data_handle() const noexcept | ||
{ | ||
return s_.data(); | ||
} | ||
|
||
/*constexpr*/ reference operator[](size_t idx) const noexcept | ||
{ | ||
assert(idx < size()); // prevents "constexpr" in C++11 | ||
return data_handle()[idx]; | ||
} | ||
/*constexpr*/ reference operator()(size_t r, size_t c) const noexcept | ||
{ | ||
const auto offset = (r * extent(1)) + c; | ||
return (*this)[offset]; | ||
} | ||
|
||
constexpr size_t size() const noexcept | ||
{ | ||
return s_.size(); | ||
} | ||
|
||
constexpr bool empty() const noexcept | ||
{ | ||
return s_.empty(); | ||
} | ||
|
||
auto extent(size_type rank) const | ||
{ | ||
return ext_.extent(rank); | ||
} | ||
|
||
static constexpr auto rank() noexcept | ||
{ | ||
return extents_type::rank(); | ||
} | ||
}; | ||
} | ||
} | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -4,5 +4,3 @@ coda_add_module( | |
${MODULE_NAME} | ||
VERSION 1.0 | ||
DEPS config-c++) | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.