Skip to content

Commit

Permalink
again, don't need a class just to convert from std::vector<> to std::…
Browse files Browse the repository at this point in the history
…span<>
  • Loading branch information
Dan Smith committed Jan 17, 2023
1 parent 24c2b48 commit 3f8ba7a
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 81 deletions.
2 changes: 1 addition & 1 deletion modules/c++/mem/include/mem/AutoPtr.h
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@
#define CODA_OSS_mem_AutoPtr_h_INCLUDED_
#pragma once

#include <memory>
#include <std/memory>

#include "coda_oss/memory.h"
#include "mem/SharedPtr.h"
Expand Down
92 changes: 14 additions & 78 deletions modules/c++/mem/include/mem/ComplexView.h
Original file line number Diff line number Diff line change
Expand Up @@ -244,17 +244,17 @@ struct ComplexSpanView final
span_t_ data_; // i.e., std::span<const std::complex<float>>
};
template <typename T>
inline auto make_ComplexSpanView(coda_oss::span<const std::complex<T>> s)
inline ComplexSpanView<T> make_ComplexSpanView(coda_oss::span<const std::complex<T>> s)
{
return ComplexSpanView<T>(s);
}
template <typename TVectorLike>
inline auto make_ComplexSpanView(const TVectorLike& v)
{
using cxvalue_t = typename TVectorLike::value_type; // i.e., std::complex<float>
const coda_oss::span<const cxvalue_t> s(v.data(), v.size());
using axis_t = typename cxvalue_t::value_type; // i.e., float
return ComplexSpanView<axis_t>(s);
using span_t = coda_oss::span<const cxvalue_t>;

return make_ComplexSpanView(span_t(v.data(), v.size()));
}

template <typename T>
Expand Down Expand Up @@ -343,86 +343,22 @@ struct ComplexSpansView final // "Span_s_,", i.e., two spans. Avoiding "parallel
span_t_ imags_;
};
template <typename T>
inline auto make_ComplexSpansView(coda_oss::span<const T> reals, coda_oss::span<const T> imags)
inline ComplexSpansView<T> make_ComplexSpansView(
coda_oss::span<const T> reals, coda_oss::span<const T> imags)
{
return ComplexSpansView<T>(reals, imags);
}

template <typename TVectorLike> // e.g., std::vector<float>
struct ComplexArraysView final // "Array_s_,", i.e., two arrays. Avoiding "parallel" because that can conjure up multi-threading thoughts.
template <typename TVectorLike>
inline auto make_ComplexSpansView(const TVectorLike& reals_, const TVectorLike& imags_)
{
using size_type = size_t;
using value_type = typename TVectorLike::value_type; // i.e., float
using cxvalue_t_ = std::complex<value_type>;
using axis_t_ = typename cxvalue_t_::value_type; // i.e., float
using span_t_ = coda_oss::span<const value_type>;
using view_t_ = ComplexSpansView<axis_t_>;
using const_iterator = typename view_t_::const_iterator;
using iterator = const_iterator;

ComplexArraysView() = delete;
~ComplexArraysView() = default;
ComplexArraysView(const TVectorLike& reals, const TVectorLike& imags) :
view(span_t_(reals.data(), reals.size()), span_t_(imags.data(), imags.size()))
{
}
ComplexArraysView(const ComplexArraysView&) = default;
ComplexArraysView& operator=(const ComplexArraysView&) = default;
ComplexArraysView(ComplexArraysView&&) = default;
ComplexArraysView& operator=(ComplexArraysView&&) = default;

constexpr auto real(size_type idx) const noexcept
{
return view.real(idx);
}
constexpr auto imag(size_type idx) const noexcept
{
return view.imag(idx);
}

constexpr cxvalue_t_ index(size_type idx) const noexcept // i.e., std::complex<float>
{
return view[idx];
}
constexpr auto operator[](size_type idx) const noexcept
{
return index(idx);
}

constexpr size_type size() const noexcept
{
return view.size();
}

auto begin() const
{
return view.begin();
}
auto end() const
{
return view.end();
}

auto reals() const
{
return view.reals();
}
auto imags() const
{
return view.imags();
}
auto values() const
{
return view.values();
}
using cxvalue_t = std::complex<value_type>; // i.e., std::complex<float>
using axis_t = typename cxvalue_t::value_type; // i.e., float
using span_t = coda_oss::span<const axis_t>;

private:
view_t_ view; // i.e., ComplexSpansView<float>
};
template <typename TVectorLike>
inline auto make_ComplexArraysView(const TVectorLike& reals, const TVectorLike& imags)
{
return ComplexArraysView<TVectorLike>(reals, imags);
const span_t reals(reals_.data(), reals_.size());
const span_t imags(imags_.data(), imags_.size());
return make_ComplexSpansView(reals, imags);
}

}
Expand Down
4 changes: 2 additions & 2 deletions modules/c++/mem/unittests/test_vector_pointers.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ TEST_CASE(testComplexViewFloat)
test_cx_view(testName, view.values());
}
{
const auto view = mem::make_ComplexArraysView(reals, imags);
const auto view = mem::make_ComplexSpansView(reals, imags);
TEST_ASSERT_EQ(reals.size(), view.size());
test_mem_ComplexView(testName, view);
test_cx_view(testName, view.values());
Expand Down Expand Up @@ -274,7 +274,7 @@ TEST_CASE(testComplexViewFloatIterator)
test_mem_ComplexViewConstIterator(testName, view);
}
{
const auto view = mem::make_ComplexArraysView(reals, imags);
const auto view = mem::make_ComplexSpansView(reals, imags);
test_mem_ComplexViewConstIterator(testName, view);
}
}
Expand Down

0 comments on commit 3f8ba7a

Please sign in to comment.