|
8 | 8 | #define BOOST_MATH_INTERPOLATORS_CUBIC_HERMITE_HPP
|
9 | 9 | #include <memory>
|
10 | 10 | #include <boost/math/interpolators/detail/cubic_hermite_detail.hpp>
|
| 11 | +#include <boost/math/policies/error_handling.hpp> |
11 | 12 |
|
12 | 13 | namespace boost {
|
13 | 14 | namespace math {
|
14 | 15 | namespace interpolators {
|
15 | 16 |
|
16 |
| -template<class RandomAccessContainer> |
| 17 | +template<class RandomAccessContainer, class Policy = policies::policy<>> |
17 | 18 | class cubic_hermite {
|
18 | 19 | public:
|
19 | 20 | using Real = typename RandomAccessContainer::value_type;
|
20 | 21 |
|
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 | + } |
24 | 38 |
|
25 | 39 | inline Real operator()(Real x) const {
|
26 | 40 | return impl_->operator()(x);
|
@@ -52,17 +66,33 @@ class cubic_hermite {
|
52 | 66 | }
|
53 | 67 |
|
54 | 68 | private:
|
| 69 | + cubic_hermite(std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl) |
| 70 | + : impl_(impl) |
| 71 | + {} |
| 72 | + |
55 | 73 | std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl_;
|
56 | 74 | };
|
57 | 75 |
|
58 |
| -template<class RandomAccessContainer> |
| 76 | +template<class RandomAccessContainer, class Policy = policies::policy<>> |
59 | 77 | class cardinal_cubic_hermite {
|
60 | 78 | public:
|
61 | 79 | using Real = typename RandomAccessContainer::value_type;
|
62 | 80 |
|
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 | + } |
66 | 96 |
|
67 | 97 | inline Real operator()(Real x) const
|
68 | 98 | {
|
@@ -91,19 +121,34 @@ class cardinal_cubic_hermite {
|
91 | 121 | }
|
92 | 122 |
|
93 | 123 | private:
|
| 124 | + cardinal_cubic_hermite(std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl) |
| 125 | + : impl_(impl) |
| 126 | + {} |
| 127 | + |
94 | 128 | std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl_;
|
95 | 129 | };
|
96 | 130 |
|
97 |
| - |
98 |
| -template<class RandomAccessContainer> |
| 131 | +template<class RandomAccessContainer, class Policy = policies::policy<>> |
99 | 132 | class cardinal_cubic_hermite_aos {
|
100 | 133 | public:
|
101 | 134 | using Point = typename RandomAccessContainer::value_type;
|
102 | 135 | using Real = typename Point::value_type;
|
103 | 136 |
|
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 | + } |
107 | 152 |
|
108 | 153 | inline Real operator()(Real x) const
|
109 | 154 | {
|
@@ -132,6 +177,10 @@ class cardinal_cubic_hermite_aos {
|
132 | 177 | }
|
133 | 178 |
|
134 | 179 | private:
|
| 180 | + cardinal_cubic_hermite_aos(std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl) |
| 181 | + : impl_(impl) |
| 182 | + {} |
| 183 | + |
135 | 184 | std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl_;
|
136 | 185 | };
|
137 | 186 |
|
|
0 commit comments