Program Listing for File Field.hpp

Return to documentation for file (core/include/Field.hpp)

#pragma once
#include "Layout.hpp"
#include <array>
#include <cstddef>
#include <span>

namespace core
{

template <class T> class Field
{
    T* data_ = nullptr;        // host (or UM) pointer
    std::array<int, 3> ext_{}; // totals including ghosts
    int ng_ = 0;
    layout::Indexer3D idx_{};

  public:
    Field() = default;
    Field(T* p, std::array<int, 3> e, int ng)
        : data_(p), ext_(e), ng_(ng), idx_{layout::Indexer3D{e[0], e[1], e[2]}}
    {
    }

    inline T& operator()(int i, int j, int k) noexcept
    {
        return data_[idx_(i + ng_, j + ng_, k + ng_)];
    }
    inline const T& operator()(int i, int j, int k) const noexcept
    {
        return data_[idx_(i + ng_, j + ng_, k + ng_)];
    }

    std::span<T> span() noexcept
    {
        return {data_, static_cast<std::size_t>(ext_[0]) * static_cast<std::size_t>(ext_[1]) *
                           static_cast<std::size_t>(ext_[2])};
    }

    // Raw typed pointer accessors
    T* raw() noexcept { return data_; }
    const T* raw() const noexcept { return data_; }

    const std::array<int, 3>& extents() const noexcept { return ext_; }
    int ng() const noexcept { return ng_; }
};

} // namespace core