147 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#ifndef BOOST_MATH_INTERPOLATORS_SEPTIC_HERMITE_HPP8#define BOOST_MATH_INTERPOLATORS_SEPTIC_HERMITE_HPP9#include <algorithm>10#include <stdexcept>11#include <memory>12#include <boost/math/interpolators/detail/septic_hermite_detail.hpp>13 14namespace boost {15namespace math {16namespace interpolators {17 18template<class RandomAccessContainer>19class septic_hermite20{21public:22 using Real = typename RandomAccessContainer::value_type;23 septic_hermite(RandomAccessContainer && x, RandomAccessContainer && y, RandomAccessContainer && dydx, 24 RandomAccessContainer && d2ydx2, RandomAccessContainer && d3ydx3)25 : impl_(std::make_shared<detail::septic_hermite_detail<RandomAccessContainer>>(std::move(x), 26 std::move(y), std::move(dydx), std::move(d2ydx2), std::move(d3ydx3)))27 {}28 29 inline Real operator()(Real x) const30 {31 return impl_->operator()(x);32 }33 34 inline Real prime(Real x) const35 {36 return impl_->prime(x);37 }38 39 inline Real double_prime(Real x) const40 {41 return impl_->double_prime(x);42 }43 44 friend std::ostream& operator<<(std::ostream & os, const septic_hermite & m)45 {46 os << *m.impl_;47 return os;48 }49 50 int64_t bytes() const51 {52 return impl_->bytes() + sizeof(impl_);53 }54 55 std::pair<Real, Real> domain() const56 {57 return impl_->domain();58 }59 60private:61 std::shared_ptr<detail::septic_hermite_detail<RandomAccessContainer>> impl_;62};63 64template<class RandomAccessContainer>65class cardinal_septic_hermite66{67public:68 using Real = typename RandomAccessContainer::value_type;69 cardinal_septic_hermite(RandomAccessContainer && y, RandomAccessContainer && dydx,70 RandomAccessContainer && d2ydx2, RandomAccessContainer && d3ydx3, Real x0, Real dx)71 : impl_(std::make_shared<detail::cardinal_septic_hermite_detail<RandomAccessContainer>>(72 std::move(y), std::move(dydx), std::move(d2ydx2), std::move(d3ydx3), x0, dx))73 {}74 75 inline Real operator()(Real x) const76 {77 return impl_->operator()(x);78 }79 80 inline Real prime(Real x) const81 {82 return impl_->prime(x);83 }84 85 inline Real double_prime(Real x) const86 {87 return impl_->double_prime(x);88 }89 90 int64_t bytes() const91 {92 return impl_->bytes() + sizeof(impl_);93 }94 95 std::pair<Real, Real> domain() const96 {97 return impl_->domain();98 }99 100private:101 std::shared_ptr<detail::cardinal_septic_hermite_detail<RandomAccessContainer>> impl_;102};103 104 105template<class RandomAccessContainer>106class cardinal_septic_hermite_aos {107public:108 using Point = typename RandomAccessContainer::value_type;109 using Real = typename Point::value_type;110 cardinal_septic_hermite_aos(RandomAccessContainer && data, Real x0, Real dx)111 : impl_(std::make_shared<detail::cardinal_septic_hermite_detail_aos<RandomAccessContainer>>(std::move(data), x0, dx))112 {}113 114 inline Real operator()(Real x) const115 {116 return impl_->operator()(x);117 }118 119 inline Real prime(Real x) const120 {121 return impl_->prime(x);122 }123 124 inline Real double_prime(Real x) const 125 {126 return impl_->double_prime(x);127 }128 129 int64_t bytes() const130 {131 return impl_.size() + sizeof(impl_);132 }133 134 std::pair<Real, Real> domain() const135 {136 return impl_->domain();137 }138 139private:140 std::shared_ptr<detail::cardinal_septic_hermite_detail_aos<RandomAccessContainer>> impl_;141};142 143}144}145}146#endif147