4#include <initializer_list>
13#if defined(COPP_CPP_BUILDING_LIBRARY)
14#define COPP_API __declspec(dllexport)
15#elif defined(COPP_CPP_SHARED) && COPP_CPP_SHARED
16#define COPP_API __declspec(dllimport)
20#elif defined(__GNUC__) || defined(__clang__)
21#define COPP_API __attribute__((visibility("default")))
99 class Error :
public std::runtime_error
103 : std::runtime_error(std::move(message)), status_(
status) {}
137 template <
typename T>
145 constexpr Span() noexcept = default;
149 template <std::
size_t N>
154 typename =
decltype(std::declval<Container &>().data()),
155 typename =
decltype(std::declval<Container &>().
size())>
156 Span(Container &container) noexcept
157 : data_(container.data()), size_(
static_cast<std::size_t
>(container.size())) {}
161 typename =
decltype(std::declval<const Container &>().data()),
162 typename =
decltype(std::declval<const Container &>().
size()),
164 typename =
typename std::enable_if<std::is_const<U>::value>::type>
165 Span(
const Container &container) noexcept
166 : data_(container.data()), size_(
static_cast<std::size_t
>(container.size())) {}
169 constexpr std::size_t
size() const noexcept {
return size_; }
170 constexpr bool empty() const noexcept {
return size_ == 0; }
176 std::size_t size_ = 0;
220 std::size_t
cols)
noexcept
237 std::size_t
cols)
noexcept
242 constexpr const double *
data() const noexcept {
return data_; }
243 constexpr std::size_t
rows() const noexcept {
return rows_; }
244 constexpr std::size_t
cols() const noexcept {
return cols_; }
246 constexpr std::size_t
leading_dim() const noexcept {
return leading_dim_; }
250 if (rows_ == 0 || cols_ == 0)
256 return leading_dim_ * (cols_ - 1) + rows_;
258 return leading_dim_ * (rows_ - 1) + cols_;
262 const double *data_ =
nullptr;
263 std::size_t rows_ = 0;
264 std::size_t cols_ = 0;
266 std::size_t leading_dim_ = 0;
302 std::size_t
cols)
noexcept
316 constexpr double *
data() const noexcept {
return data_; }
317 constexpr std::size_t
rows() const noexcept {
return rows_; }
318 constexpr std::size_t
cols() const noexcept {
return cols_; }
319 constexpr std::size_t
leading_dim() const noexcept {
return leading_dim_; }
321 double &
operator()(std::size_t row, std::size_t col)
const noexcept
323 return data_[row + col * leading_dim_];
327 double *data_ =
nullptr;
328 std::size_t rows_ = 0;
329 std::size_t cols_ = 0;
330 std::size_t leading_dim_ = 0;
362 if (data_.size() != rows_ * cols_)
364 throw Error(Status::invalid_input,
"Matrix data length does not match shape");
384 if (
rows.size() == 0)
389 const std::size_t row_count =
rows.size();
390 const std::size_t col_count =
rows.begin()->size();
396 Matrix matrix(row_count, col_count);
398 for (
const auto &row_values :
rows)
400 if (row_values.size() != col_count)
405 for (
double value : row_values)
407 matrix(row, col) = value;
435 if (columns.size() == 0)
440 const std::size_t col_count = columns.
size();
441 const std::size_t row_count = columns.begin()->size();
447 Matrix matrix(row_count, col_count);
449 for (
const auto &col_values : columns)
451 if (col_values.size() != row_count)
456 for (
double value : col_values)
458 matrix(row, col) = value;
466 std::size_t
rows() const noexcept {
return rows_; }
467 std::size_t
cols() const noexcept {
return cols_; }
468 std::size_t
size() const noexcept {
return data_.size(); }
469 bool empty() const noexcept {
return data_.empty(); }
471 double *
data() noexcept {
return data_.data(); }
472 const double *
data() const noexcept {
return data_.data(); }
474 std::vector<double> &
values() noexcept {
return data_; }
475 const std::vector<double> &
values() const noexcept {
return data_; }
482 double &
operator()(std::size_t row, std::size_t col)
noexcept
484 return data_[row + col * rows_];
487 double operator()(std::size_t row, std::size_t col)
const noexcept
489 return data_[row + col * rows_];
493 std::size_t rows_ = 0;
494 std::size_t cols_ = 0;
495 std::vector<double> data_;
525 template <
typename T>
534 out.error_ =
ErrorInfo{status, std::move(message)};
538 bool has_value() const noexcept {
return value_.has_value(); }
539 explicit operator bool() const noexcept {
return has_value(); }
545 throw Error(error_.status, error_.message);
554 throw Error(error_.status, error_.message);
563 throw Error(error_.status, error_.message);
565 return std::move(*value_);
573 std::optional<T> value_;
579 template <
typename Fn>
582 using T =
typename std::decay<
decltype(fn())>::type;
587 catch (
const Error &error)
591 catch (
const std::exception &error)
Exception type thrown by the default C++ API.
Status status() const noexcept
Error(Status status, std::string message)
Small C++17 expected-like result used by no-throw overloads.
bool has_value() const noexcept
const ErrorInfo & error() const noexcept
const T & value() const &
static Expected failure(Status status, std::string message)
double & operator()(std::size_t row, std::size_t col) noexcept
const double * data() const noexcept
static Matrix from_columns(std::initializer_list< std::initializer_list< double > > columns)
Build a matrix from column-major initializer-list notation.
double operator()(std::size_t row, std::size_t col) const noexcept
std::size_t cols() const noexcept
MatrixView view() const noexcept
std::size_t size() const noexcept
bool empty() const noexcept
const std::vector< double > & values() const noexcept
std::size_t rows() const noexcept
Matrix(std::size_t rows, std::size_t cols)
std::vector< double > & values() noexcept
static Matrix from_rows(std::initializer_list< std::initializer_list< double > > rows)
Build a matrix from row-major initializer-list notation.
Matrix(std::size_t rows, std::size_t cols, std::vector< double > data)
double & operator()(std::size_t row, std::size_t col) const noexcept
constexpr std::size_t leading_dim() const noexcept
constexpr double * data() const noexcept
static constexpr MatrixRef strided_column_major(double *data, std::size_t rows, std::size_t cols, std::size_t leading_dim) noexcept
constexpr MatrixRef() noexcept=default
constexpr std::size_t cols() const noexcept
constexpr std::size_t rows() const noexcept
static constexpr MatrixRef column_major(double *data, std::size_t rows, std::size_t cols) noexcept
Non-owning view of a two-dimensional double matrix.
constexpr std::size_t storage_size() const noexcept
constexpr std::size_t leading_dim() const noexcept
constexpr MatrixLayout layout() const noexcept
static constexpr MatrixView row_major(const double *data, std::size_t rows, std::size_t cols) noexcept
constexpr std::size_t cols() const noexcept
static constexpr MatrixView strided_column_major(const double *data, std::size_t rows, std::size_t cols, std::size_t leading_dim) noexcept
static constexpr MatrixView column_major(const double *data, std::size_t rows, std::size_t cols) noexcept
constexpr MatrixView() noexcept=default
constexpr std::size_t rows() const noexcept
constexpr const double * data() const noexcept
constexpr bool empty() const noexcept
constexpr Span() noexcept=default
constexpr Span(element_type(&data)[N]) noexcept
Span(Container &container) noexcept
constexpr pointer data() const noexcept
constexpr std::size_t size() const noexcept
Span(const Container &container) noexcept
reference operator[](std::size_t index) const noexcept
auto expected_from(Fn &&fn) -> Expected< typename std::decay< decltype(fn())>::type >
Root namespace for the C++ facade: paths, robots, constraints, matrices, profiles,...
MatrixLayout
Memory layout for borrowed matrix views.
Verbosity
Diagnostic verbosity for solver algorithms.
Status
Coarse error category reported by the C++ facade.
constexpr NoThrowTag no_throw
@ Error
Throw copp::Error when any query sample is outside [s_min, s_max].
COPP_API std::string version()
Return the Rust crate version backing this C++ facade.
Second-order endpoint boundary values.
Third-order endpoint boundary values.
Lightweight error payload returned by no-throw APIs.
Closed station-index interval used by TOPP/COPP problem descriptors.
Tag object selecting no-throw overloads.
constexpr NoThrowTag()=default