Skip to content

Commit

Permalink
Cleanup write
Browse files Browse the repository at this point in the history
  • Loading branch information
jfalcou committed May 19, 2024
1 parent b1cbea2 commit 9477823
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 61 deletions.
5 changes: 1 addition & 4 deletions include/eve/module/algo/algo/views/backward.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -123,10 +123,7 @@ namespace eve::algo::views
return eve::read(unalign(self.base) - 1);
}

EVE_FORCEINLINE friend void tagged_dispatch(eve::tag::write_, value_type v, backward_iterator self)
{
return eve::write(v, unalign(self.base) - 1);
}
EVE_FORCEINLINE void write(value_type v) const noexcept { eve::write(v, unalign(base) - 1); }

template <relaxed_sentinel_for<I> I1>
EVE_FORCEINLINE bool operator==(backward_iterator<I1> y) const
Expand Down
4 changes: 2 additions & 2 deletions include/eve/module/algo/algo/views/convert.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,9 +156,9 @@ namespace eve::algo::views
return eve::convert(eve::read(self.base), eve::as<T>{});
}

EVE_FORCEINLINE friend void tagged_dispatch(eve::tag::write_, T v, converting_iterator self)
EVE_FORCEINLINE void write(T v) const noexcept
{
eve::write(eve::convert(v, eve::as<value_type_t<I>>{}),self.base);
eve::write(eve::convert(v, eve::as<value_type_t<I>>{}),base);
}

template <relaxed_sentinel_for<I> I1>
Expand Down
6 changes: 3 additions & 3 deletions include/eve/module/algo/algo/views/map.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -254,10 +254,10 @@ namespace eve::algo::views
return self.load_op(eve::read(self.base));
}

EVE_FORCEINLINE friend void tagged_dispatch(eve::tag::write_, auto v, map_iterator self)
requires (!std::same_as<StoreOp, nothing_t>)
EVE_FORCEINLINE void write(value_type v) const noexcept
requires (!std::same_as<StoreOp, nothing_t>)
{
eve::write(detail::bind_store_op<I>(self.store_op)(v),self.base);
eve::write(detail::bind_store_op<I>(store_op)(v),base);
}

template <relaxed_sentinel_for<I> I1>
Expand Down
5 changes: 1 addition & 4 deletions include/eve/module/algo/algo/views/reverse.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -115,10 +115,7 @@ namespace eve::algo::views
return eve::read(unalign(self.base) - 1);
}

EVE_FORCEINLINE friend void tagged_dispatch(eve::tag::write_, value_type v, reverse_iterator self)
{
return eve::write(v,unalign(self.base) - 1);
}
EVE_FORCEINLINE void write(value_type v) const noexcept { return eve::write(v,unalign(base) - 1); }

template <relaxed_sentinel_for<I> I1>
EVE_FORCEINLINE bool operator==(reverse_iterator<I1> y) const
Expand Down
5 changes: 1 addition & 4 deletions include/eve/module/algo/algo/views/zip_iterator.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,7 @@ namespace eve::algo::views
return kumi::map(eve::read, self.storage);
}

EVE_FORCEINLINE friend auto tagged_dispatch(eve::tag::write_, value_type v, zip_iterator<Is...> self)
{
kumi::for_each(eve::write, v, self.storage);
}
EVE_FORCEINLINE void write(value_type v) const noexcept { kumi::for_each(eve::write, v, storage); }

EVE_FORCEINLINE operator zip_iterator<unaligned_t<Is>...>() const
{
Expand Down
121 changes: 77 additions & 44 deletions include/eve/module/core/regular/write.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,62 +8,95 @@
#pragma once

#include <eve/arch.hpp>
#include <eve/concept/vectorizable.hpp>
#include <eve/detail/implementation.hpp>
#include <eve/concept/value.hpp>
#include <eve/traits/overload.hpp>
#include <eve/memory/soa_ptr.hpp>

namespace eve
{
//================================================================================================
//! @addtogroup memory
//! @{
//! @var write
//!
//! @brief Callable object writing single value from memory
//!
//! **Required header:** `#include <eve/module/core.hpp>`
//!
//! `operator*` based interface used in the standard has notorious issues with proxy references.
//! To prevent those issues when dealing with complex, potentially SIMD-aware iterators,
//! `eve::write` is to be used.
//!
//! #### Members Functions
//!
//! | Member | Effect |
//! |:-------------|:-----------------------------------------------------------|
//! | `operator()` | Performs a single write to memory |
//!
//! ---
//!
//! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~{.cpp}
//! template<typename Ptr, scalar_value V> auto operator()(V v,Ptr p) const noexcept
//! ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//!
//! **Parameters**
//!
//! `v` : [scalar value](@ref eve::scalar_value) to write.
//! `ptr`: Memory to write to.
//!
//! @}
//================================================================================================
EVE_MAKE_CALLABLE(write_, write);
template<typename Options>
struct write_t : callable<write_t, Options>
{
template<typename Ptr, scalar_value V>
requires requires(Ptr p, V v) { *p = v; }
EVE_FORCEINLINE void operator()(V v, Ptr ptr) const noexcept{ return EVE_DISPATCH_CALL(v,ptr); }

template<typename Writeable, scalar_value V>
requires requires(Writeable p, V v) { p.write(v); }
EVE_FORCEINLINE void operator()(V v, Writeable p) const noexcept{ return EVE_DISPATCH_CALL(v,p); }

template<typename... Ptrs, scalar_value V>
EVE_FORCEINLINE void operator()(V v, soa_ptr<Ptrs...> ptr) const noexcept{ return EVE_DISPATCH_CALL(v,ptr); }

EVE_CALLABLE_OBJECT(write_t, write_);
};

//================================================================================================
//! @addtogroup memory
//! @{
//! @var write
//! @brief Callable object writing a scalar value to memory
//!
//! `operator*` based interface used in the standard has notorious issues with proxy references.
//! To prevent those issues when dealing with complex, potentially SIMD-aware iterators, `eve::write` is to be used.
//!
//! **Defined in Header**
//!
//! @code
//! #include <eve/module/core.hpp>
//! @endcode
//!
//! @groupheader{Callable Signatures}
//!
//! @code
//! namespace eve
//! {
//! template<typename Ptr, scalar_value V>
//! requires requires(Ptr p, V v) { *p = v; }
//! EVE_FORCEINLINE void operator()(V v, Ptr p) const noexcept; // 1
//!
//! template<typename Writeable, scalar_value V>
//! requires requires(Writeable p, V v) { p.write(v); }
//! EVE_FORCEINLINE void operator()(V v, Writeable p) const noexcept; // 2
//!
//! template<typename... Ptrs, scalar_value V>
//! EVE_FORCEINLINE void operator()(V v, soa_ptr<Ptrs...> p) const noexcept; // 3
//! }
//! @endcode
//!
//! 1. Write the [scalar](@ref eve::scalar_value) `v` into the memory pointed by `p`;
//! 2. Write the [scalar](@ref eve::scalar_value) `v` into the memory managed by the object `p`;
//! 3. Write the [scalar](@ref eve::scalar_value) `v` into the memory pointed by SoA pointer `p`;
//!
//! **Parameters**
//!
//! * `v`: [scalar](@ref eve::scalar_value) to write to memory.
//! * `p`: A pointer or rich iterator to write to.
//!
//! @}
//================================================================================================
inline constexpr auto write = functor<write_t>;
}

namespace detail
namespace eve::detail
{
template<typename Ptr, scalar_value V>
EVE_FORCEINLINE void write_(EVE_SUPPORTS(cpu_), V v, Ptr ptr) noexcept requires
requires(Ptr p, V v)
template<callable_options O, typename Ptr, scalar_value V>
requires requires(Ptr p, V v) { *p = v; }
EVE_FORCEINLINE void write_(EVE_REQUIRES(cpu_), O const&, V v, Ptr ptr) noexcept
{
*p = v;
*ptr = v;
}

template<callable_options O, typename Writeable, scalar_value V>
requires requires(Writeable p, V v) { p.write(v); }
EVE_FORCEINLINE void write_(EVE_REQUIRES(cpu_), O const&, V v, Writeable p) noexcept
{
*ptr = v;
p.write(v);
}

template<scalar_value V, typename... Ptrs>
EVE_FORCEINLINE void write_(EVE_SUPPORTS(cpu_), V v, soa_ptr<Ptrs...> ptr) noexcept
template<callable_options O, typename... Ptrs, scalar_value V>
EVE_FORCEINLINE void write_(EVE_REQUIRES(cpu_), O const&, V v, soa_ptr<Ptrs...> ptr) noexcept
{
kumi::for_each(write, v, ptr);
}
}
}

0 comments on commit 9477823

Please sign in to comment.