2 * Copyright Nick Thompson, 2020
3 * Use, modification and distribution are subject to the
4 * Boost Software License, Version 1.0. (See accompanying file
5 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 #ifndef BOOST_MATH_INTERPOLATORS_QUINTIC_HERMITE_HPP
9 #define BOOST_MATH_INTERPOLATORS_QUINTIC_HERMITE_HPP
13 #include <boost/math/interpolators/detail/quintic_hermite_detail.hpp>
17 namespace interpolators {
19 template<class RandomAccessContainer>
20 class quintic_hermite {
22 using Real = typename RandomAccessContainer::value_type;
23 quintic_hermite(RandomAccessContainer && x, RandomAccessContainer && y, RandomAccessContainer && dydx, RandomAccessContainer && d2ydx2)
24 : impl_(std::make_shared<detail::quintic_hermite_detail<RandomAccessContainer>>(std::move(x), std::move(y), std::move(dydx), std::move(d2ydx2)))
27 Real operator()(Real x) const
29 return impl_->operator()(x);
32 Real prime(Real x) const
34 return impl_->prime(x);
37 Real double_prime(Real x) const
39 return impl_->double_prime(x);
42 friend std::ostream& operator<<(std::ostream & os, const quintic_hermite & m)
48 void push_back(Real x, Real y, Real dydx, Real d2ydx2)
50 impl_->push_back(x, y, dydx, d2ydx2);
55 return impl_->bytes() + sizeof(impl_);
58 std::pair<Real, Real> domain() const
60 return impl_->domain();
64 std::shared_ptr<detail::quintic_hermite_detail<RandomAccessContainer>> impl_;
67 template<class RandomAccessContainer>
68 class cardinal_quintic_hermite {
70 using Real = typename RandomAccessContainer::value_type;
71 cardinal_quintic_hermite(RandomAccessContainer && y, RandomAccessContainer && dydx, RandomAccessContainer && d2ydx2, Real x0, Real dx)
72 : impl_(std::make_shared<detail::cardinal_quintic_hermite_detail<RandomAccessContainer>>(std::move(y), std::move(dydx), std::move(d2ydx2), x0, dx))
75 inline Real operator()(Real x) const {
76 return impl_->operator()(x);
79 inline Real prime(Real x) const {
80 return impl_->prime(x);
83 inline Real double_prime(Real x) const
85 return impl_->double_prime(x);
90 return impl_->bytes() + sizeof(impl_);
93 std::pair<Real, Real> domain() const
95 return impl_->domain();
99 std::shared_ptr<detail::cardinal_quintic_hermite_detail<RandomAccessContainer>> impl_;
102 template<class RandomAccessContainer>
103 class cardinal_quintic_hermite_aos {
105 using Point = typename RandomAccessContainer::value_type;
106 using Real = typename Point::value_type;
107 cardinal_quintic_hermite_aos(RandomAccessContainer && data, Real x0, Real dx)
108 : impl_(std::make_shared<detail::cardinal_quintic_hermite_detail_aos<RandomAccessContainer>>(std::move(data), x0, dx))
111 inline Real operator()(Real x) const
113 return impl_->operator()(x);
116 inline Real prime(Real x) const
118 return impl_->prime(x);
121 inline Real double_prime(Real x) const
123 return impl_->double_prime(x);
126 int64_t bytes() const
128 return impl_->bytes() + sizeof(impl_);
131 std::pair<Real, Real> domain() const
133 return impl_->domain();
136 std::shared_ptr<detail::cardinal_quintic_hermite_detail_aos<RandomAccessContainer>> impl_;