Skip to content

Commit 6e670de

Browse files
committed
feat: use policy-based error handling in interpolators
1 parent a5c0625 commit 6e670de

File tree

7 files changed

+286
-99
lines changed

7 files changed

+286
-99
lines changed

include/boost/math/interpolators/cubic_hermite.hpp

+62-13
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,33 @@
88
#define BOOST_MATH_INTERPOLATORS_CUBIC_HERMITE_HPP
99
#include <memory>
1010
#include <boost/math/interpolators/detail/cubic_hermite_detail.hpp>
11+
#include <boost/math/policies/error_handling.hpp>
1112

1213
namespace boost {
1314
namespace math {
1415
namespace interpolators {
1516

16-
template<class RandomAccessContainer>
17+
template<class RandomAccessContainer, class Policy = policies::policy<>>
1718
class cubic_hermite {
1819
public:
1920
using Real = typename RandomAccessContainer::value_type;
2021

21-
cubic_hermite(RandomAccessContainer && x, RandomAccessContainer && y, RandomAccessContainer && dydx)
22-
: impl_(std::make_shared<detail::cubic_hermite_detail<RandomAccessContainer>>(std::move(x), std::move(y), std::move(dydx)))
23-
{}
22+
static
23+
std::pair<std::unique_ptr<cubic_hermite>, std::string>
24+
create(RandomAccessContainer&& x, RandomAccessContainer&& y, RandomAccessContainer&& dydx)
25+
{
26+
auto const ret = detail::cubic_hermite_detail<RandomAccessContainer, Policy>::create(
27+
std::move(x), std::move(y), std::move(dydx)
28+
);
29+
const auto& impl = ret.first;
30+
const auto& error_msg = ret.second;
31+
32+
if ( ! impl) {
33+
return {nullptr, error_msg};
34+
}
35+
36+
return {std::unique_ptr<cubic_hermite>(new cubic_hermite(impl)), ""};
37+
}
2438

2539
inline Real operator()(Real x) const {
2640
return impl_->operator()(x);
@@ -52,17 +66,33 @@ class cubic_hermite {
5266
}
5367

5468
private:
69+
cubic_hermite(std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl)
70+
: impl_(impl)
71+
{}
72+
5573
std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl_;
5674
};
5775

58-
template<class RandomAccessContainer>
76+
template<class RandomAccessContainer, class Policy = policies::policy<>>
5977
class cardinal_cubic_hermite {
6078
public:
6179
using Real = typename RandomAccessContainer::value_type;
6280

63-
cardinal_cubic_hermite(RandomAccessContainer && y, RandomAccessContainer && dydx, Real x0, Real dx)
64-
: impl_(std::make_shared<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>>(std::move(y), std::move(dydx), x0, dx))
65-
{}
81+
static
82+
std::pair<std::unique_ptr<cardinal_cubic_hermite>, std::string>
83+
create(RandomAccessContainer && y, RandomAccessContainer && dydx, Real x0, Real dx) {
84+
auto const ret = detail::cardinal_cubic_hermite_detail<RandomAccessContainer, Policy>::create(
85+
std::move(y), std::move(dydx), x0, dx
86+
);
87+
const auto& impl = ret.first;
88+
const auto& error_msg = ret.second;
89+
90+
if ( ! impl) {
91+
return {nullptr, error_msg};
92+
}
93+
94+
return {std::unique_ptr<cardinal_cubic_hermite>(new cardinal_cubic_hermite(impl)), ""};
95+
}
6696

6797
inline Real operator()(Real x) const
6898
{
@@ -91,19 +121,34 @@ class cardinal_cubic_hermite {
91121
}
92122

93123
private:
124+
cardinal_cubic_hermite(std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl)
125+
: impl_(impl)
126+
{}
127+
94128
std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl_;
95129
};
96130

97-
98-
template<class RandomAccessContainer>
131+
template<class RandomAccessContainer, class Policy = policies::policy<>>
99132
class cardinal_cubic_hermite_aos {
100133
public:
101134
using Point = typename RandomAccessContainer::value_type;
102135
using Real = typename Point::value_type;
103136

104-
cardinal_cubic_hermite_aos(RandomAccessContainer && data, Real x0, Real dx)
105-
: impl_(std::make_shared<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>>(std::move(data), x0, dx))
106-
{}
137+
static
138+
std::pair<std::unique_ptr<cardinal_cubic_hermite_aos>, std::string>
139+
create(RandomAccessContainer && data, Real x0, Real dx) {
140+
auto const ret = detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>::create(
141+
std::move(data), x0, dx
142+
);
143+
const auto& impl = ret.first;
144+
const auto& error_msg = ret.second;
145+
146+
if ( ! impl) {
147+
return {nullptr, error_msg};
148+
}
149+
150+
return {std::unique_ptr<cardinal_cubic_hermite_aos>(new cardinal_cubic_hermite_aos(impl)), ""};
151+
}
107152

108153
inline Real operator()(Real x) const
109154
{
@@ -132,6 +177,10 @@ class cardinal_cubic_hermite_aos {
132177
}
133178

134179
private:
180+
cardinal_cubic_hermite_aos(std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl)
181+
: impl_(impl)
182+
{}
183+
135184
std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl_;
136185
};
137186

0 commit comments

Comments
 (0)