1#ifndef FPPOINT_HPP_INCLUDED
2#define FPPOINT_HPP_INCLUDED
31#include "fitpack_core_c.h"
43template <FP_SIZE dims>
46 static_assert(dims > 0,
"fpPoint requires at least one dimension");
47 static_assert(
sizeof(std::array<FP_REAL, dims>) ==
static_cast<std::size_t
>(dims) *
sizeof(FP_REAL),
48 "std::array<FP_REAL,dims> must be exactly dims contiguous reals");
51 std::array<FP_REAL, dims>
coord;
54 constexpr FP_REAL&
operator[](FP_SIZE i) {
return coord[
static_cast<std::size_t
>(i)]; }
55 constexpr const FP_REAL&
operator[](FP_SIZE i)
const {
return coord[
static_cast<std::size_t
>(i)]; }
57 constexpr FP_SIZE
size()
const {
return dims; }
59 constexpr const FP_REAL*
data()
const {
return coord.data(); }
63 constexpr FP_REAL*
end() {
return coord.data() + dims; }
64 constexpr const FP_REAL*
begin()
const {
return coord.data(); }
65 constexpr const FP_REAL*
end()
const {
return coord.data() + dims; }
66 constexpr const FP_REAL*
cbegin()
const {
return coord.data(); }
67 constexpr const FP_REAL*
cend()
const {
return coord.data() + dims; }
71 constexpr FP_REAL&
x() {
static_assert(dims >= 1,
"fpPoint::x() requires dims >= 1");
return coord[0]; }
72 constexpr FP_REAL&
y() {
static_assert(dims >= 2,
"fpPoint::y() requires dims >= 2");
return coord[1]; }
73 constexpr FP_REAL&
z() {
static_assert(dims >= 3,
"fpPoint::z() requires dims >= 3");
return coord[2]; }
75 constexpr const FP_REAL&
x()
const {
static_assert(dims >= 1,
"fpPoint::x() requires dims >= 1");
return coord[0]; }
76 constexpr const FP_REAL&
y()
const {
static_assert(dims >= 2,
"fpPoint::y() requires dims >= 2");
return coord[1]; }
77 constexpr const FP_REAL&
z()
const {
static_assert(dims >= 3,
"fpPoint::z() requires dims >= 3");
return coord[2]; }
80template <FP_SIZE dims>
83template <FP_SIZE dims>
89 template <FP_SIZE dims>
92 static_assert(
sizeof(
fpPoint<dims>) ==
static_cast<std::size_t
>(dims) *
sizeof(FP_REAL),
93 "fpPoint<dims> must be exactly dims contiguous FP_REALs (no padding)");
94 static_assert(std::is_standard_layout<fpPoint<dims>>
::value,
95 "fpPoint<dims> must be standard-layout to alias Fortran storage");
96 static_assert(std::is_trivially_copyable<fpPoint<dims>>
::value,
97 "fpPoint<dims> must be trivially copyable to alias Fortran storage");
98 static constexpr bool value =
true;
106template <FP_SIZE dims>
110 return points.empty() ? nullptr :
reinterpret_cast<const FP_REAL*
>(points.data());
116template <FP_SIZE dims>
120 return std::vector<FP_REAL>(first, first + points.size() *
static_cast<std::size_t
>(dims));
126template <FP_SIZE dims>
127inline std::vector<fpPoint<dims>>
fpPointGather(
const std::vector<FP_REAL>& flat)
130 std::vector<fpPoint<dims>> points(flat.size() /
static_cast<std::size_t
>(dims));
133 FP_REAL* raw =
reinterpret_cast<FP_REAL*
>(points.data());
134 for (std::size_t i = 0; i < points.size() *
static_cast<std::size_t
>(dims); ++i) raw[i] = flat[i];
constexpr bool operator!=(const fpPoint< dims > &a, const fpPoint< dims > &b)
Definition fpPoint.hpp:84
constexpr bool operator==(const fpPoint< dims > &a, const fpPoint< dims > &b)
Definition fpPoint.hpp:81
const FP_REAL * fpPointData(const std::vector< fpPoint< dims > > &points)
Borrow a vector of points as a Fortran x(dims,m) buffer. No copy, no allocation.
Definition fpPoint.hpp:107
std::vector< fpPoint< dims > > fpPointGather(const std::vector< FP_REAL > &flat)
Rebuild a vector of points from a Fortran x(dims,m) buffer.
Definition fpPoint.hpp:127
std::vector< FP_REAL > fpPointFlatten(const std::vector< fpPoint< dims > > &points)
Flatten a vector of points into Fortran x(dims,m) order. One contiguous copy.
Definition fpPoint.hpp:117
Definition fpPoint.hpp:87
Instantiated at every zero-copy call site: the layout contract that makes the cast legal.
Definition fpPoint.hpp:91
static constexpr bool value
Definition fpPoint.hpp:98
A point in dims-dimensional space.
Definition fpPoint.hpp:45
constexpr const FP_REAL * end() const
Definition fpPoint.hpp:65
constexpr const FP_REAL * cbegin() const
Definition fpPoint.hpp:66
constexpr const FP_REAL & operator[](FP_SIZE i) const
Definition fpPoint.hpp:55
constexpr FP_REAL & operator[](FP_SIZE i)
Definition fpPoint.hpp:54
std::array< FP_REAL, dims > coord
Coordinates, in the same order as the Fortran leading dimension.
Definition fpPoint.hpp:51
constexpr const FP_REAL & z() const
Definition fpPoint.hpp:77
constexpr FP_REAL & y()
Definition fpPoint.hpp:72
constexpr FP_REAL * data()
Definition fpPoint.hpp:58
constexpr const FP_REAL * cend() const
Definition fpPoint.hpp:67
constexpr const FP_REAL & x() const
Definition fpPoint.hpp:75
constexpr const FP_REAL * begin() const
Definition fpPoint.hpp:64
constexpr FP_REAL * begin()
Definition fpPoint.hpp:62
constexpr FP_REAL * end()
Definition fpPoint.hpp:63
constexpr FP_REAL & x()
Definition fpPoint.hpp:71
constexpr const FP_REAL & y() const
Definition fpPoint.hpp:76
constexpr const FP_REAL * data() const
Definition fpPoint.hpp:59
constexpr FP_SIZE size() const
Definition fpPoint.hpp:57
constexpr FP_REAL & z()
Definition fpPoint.hpp:73