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
1213namespace boost {
1314namespace math {
1415namespace interpolators {
1516
16- template <class RandomAccessContainer >
17+ template <class RandomAccessContainer , class Policy = policies::policy<> >
1718class cubic_hermite {
1819public:
1920 using Real = typename RandomAccessContainer::value_type;
2021
2122 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+ : impl_(std::make_shared<detail::cubic_hermite_detail<RandomAccessContainer, Policy >>(std::move(x), std::move(y), std::move(dydx)))
2324 {}
24-
25+
2526 inline Real operator ()(Real x) const {
2627 return impl_->operator ()(x);
2728 }
@@ -43,6 +44,7 @@ class cubic_hermite {
4344
4445 int64_t bytes () const
4546 {
47+ if ( ! valid ()) return 0 ;
4648 return impl_->bytes () + sizeof (impl_);
4749 }
4850
@@ -51,17 +53,25 @@ class cubic_hermite {
5153 return impl_->domain ();
5254 }
5355
56+ bool valid () const {
57+ return impl_->valid ();
58+ }
59+
60+ std::string const & error_msg () const {
61+ return impl_->error_msg ();
62+ }
63+
5464private:
5565 std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl_;
5666};
5767
58- template <class RandomAccessContainer >
68+ template <class RandomAccessContainer , class Policy = policies::policy<> >
5969class cardinal_cubic_hermite {
6070public:
6171 using Real = typename RandomAccessContainer::value_type;
6272
6373 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))
74+ : impl_(std::make_shared<detail::cardinal_cubic_hermite_detail<RandomAccessContainer, Policy >>(std::move(y), std::move(dydx), x0, dx))
6575 {}
6676
6777 inline Real operator ()(Real x) const
@@ -82,6 +92,7 @@ class cardinal_cubic_hermite {
8292
8393 int64_t bytes () const
8494 {
95+ if ( ! valid ()) return 0 ;
8596 return impl_->bytes () + sizeof (impl_);
8697 }
8798
@@ -90,19 +101,26 @@ class cardinal_cubic_hermite {
90101 return impl_->domain ();
91102 }
92103
104+ bool valid () const {
105+ return impl_->valid ();
106+ }
107+
108+ std::string const & error_msg () const {
109+ return impl_->error_msg ();
110+ }
111+
93112private:
94113 std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl_;
95114};
96115
97-
98- template <class RandomAccessContainer >
116+ template <class RandomAccessContainer , class Policy = policies::policy<>>
99117class cardinal_cubic_hermite_aos {
100118public:
101119 using Point = typename RandomAccessContainer::value_type;
102120 using Real = typename Point::value_type;
103121
104122 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))
123+ : impl_(std::make_shared<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer, Policy >>(std::move(data), x0, dx))
106124 {}
107125
108126 inline Real operator ()(Real x) const
@@ -123,6 +141,7 @@ class cardinal_cubic_hermite_aos {
123141
124142 int64_t bytes () const
125143 {
144+ if ( ! valid ()) return 0 ;
126145 return impl_->bytes () + sizeof (impl_);
127146 }
128147
@@ -131,6 +150,14 @@ class cardinal_cubic_hermite_aos {
131150 return impl_->domain ();
132151 }
133152
153+ bool valid () const {
154+ return impl_->valid ();
155+ }
156+
157+ std::string const & error_msg () const {
158+ return impl_->error_msg ();
159+ }
160+
134161private:
135162 std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl_;
136163};
0 commit comments