143 lines · plain
1/*2 * Copyright Nick Thompson, 20203 * Use, modification and distribution are subject to the4 * Boost Software License, Version 1.0. (See accompanying file5 * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)6 */7 8#ifndef BOOST_MATH_INTERPOLATORS_QUINTIC_HERMITE_HPP9#define BOOST_MATH_INTERPOLATORS_QUINTIC_HERMITE_HPP10#include <algorithm>11#include <stdexcept>12#include <memory>13#include <boost/math/interpolators/detail/quintic_hermite_detail.hpp>14 15namespace boost {16namespace math {17namespace interpolators {18 19template<class RandomAccessContainer>20class quintic_hermite {21public: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)))25 {}26 27 Real operator()(Real x) const28 {29 return impl_->operator()(x);30 }31 32 Real prime(Real x) const33 {34 return impl_->prime(x);35 }36 37 Real double_prime(Real x) const38 {39 return impl_->double_prime(x);40 }41 42 friend std::ostream& operator<<(std::ostream & os, const quintic_hermite & m)43 {44 os << *m.impl_;45 return os;46 }47 48 void push_back(Real x, Real y, Real dydx, Real d2ydx2)49 {50 impl_->push_back(x, y, dydx, d2ydx2);51 }52 53 int64_t bytes() const54 {55 return impl_->bytes() + sizeof(impl_);56 }57 58 std::pair<Real, Real> domain() const59 {60 return impl_->domain();61 }62 63private:64 std::shared_ptr<detail::quintic_hermite_detail<RandomAccessContainer>> impl_;65};66 67template<class RandomAccessContainer>68class cardinal_quintic_hermite {69public: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))73 {}74 75 inline Real operator()(Real x) const {76 return impl_->operator()(x);77 }78 79 inline Real prime(Real x) const {80 return impl_->prime(x);81 }82 83 inline Real double_prime(Real x) const84 {85 return impl_->double_prime(x);86 }87 88 int64_t bytes() const89 {90 return impl_->bytes() + sizeof(impl_);91 }92 93 std::pair<Real, Real> domain() const94 {95 return impl_->domain();96 }97 98private:99 std::shared_ptr<detail::cardinal_quintic_hermite_detail<RandomAccessContainer>> impl_;100};101 102template<class RandomAccessContainer>103class cardinal_quintic_hermite_aos {104public: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))109 {}110 111 inline Real operator()(Real x) const112 {113 return impl_->operator()(x);114 }115 116 inline Real prime(Real x) const117 {118 return impl_->prime(x);119 }120 121 inline Real double_prime(Real x) const122 {123 return impl_->double_prime(x);124 }125 126 int64_t bytes() const127 {128 return impl_->bytes() + sizeof(impl_);129 }130 131 std::pair<Real, Real> domain() const132 {133 return impl_->domain();134 }135private:136 std::shared_ptr<detail::cardinal_quintic_hermite_detail_aos<RandomAccessContainer>> impl_;137};138 139}140}141}142#endif143