142 lines · plain
1// Copyright Nick Thompson, 20202// Use, modification and distribution are subject to the3// Boost Software License, Version 1.0.4// (See accompanying file LICENSE_1_0.txt5// or copy at http://www.boost.org/LICENSE_1_0.txt)6 7#ifndef BOOST_MATH_INTERPOLATORS_CUBIC_HERMITE_HPP8#define BOOST_MATH_INTERPOLATORS_CUBIC_HERMITE_HPP9#include <memory>10#include <boost/math/interpolators/detail/cubic_hermite_detail.hpp>11 12namespace boost {13namespace math {14namespace interpolators {15 16template<class RandomAccessContainer>17class cubic_hermite {18public:19 using Real = typename RandomAccessContainer::value_type;20 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 {}24 25 inline Real operator()(Real x) const {26 return impl_->operator()(x);27 }28 29 inline Real prime(Real x) const {30 return impl_->prime(x);31 }32 33 friend std::ostream& operator<<(std::ostream & os, const cubic_hermite & m)34 {35 os << *m.impl_;36 return os;37 }38 39 void push_back(Real x, Real y, Real dydx)40 {41 impl_->push_back(x, y, dydx);42 }43 44 int64_t bytes() const45 {46 return impl_->bytes() + sizeof(impl_);47 }48 49 std::pair<Real, Real> domain() const50 {51 return impl_->domain();52 }53 54private:55 std::shared_ptr<detail::cubic_hermite_detail<RandomAccessContainer>> impl_;56};57 58template<class RandomAccessContainer>59class cardinal_cubic_hermite {60public:61 using Real = typename RandomAccessContainer::value_type;62 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 {}66 67 inline Real operator()(Real x) const68 {69 return impl_->operator()(x);70 }71 72 inline Real prime(Real x) const73 {74 return impl_->prime(x);75 }76 77 friend std::ostream& operator<<(std::ostream & os, const cardinal_cubic_hermite & m)78 {79 os << *m.impl_;80 return os;81 }82 83 int64_t bytes() const84 {85 return impl_->bytes() + sizeof(impl_);86 }87 88 std::pair<Real, Real> domain() const89 {90 return impl_->domain();91 }92 93private:94 std::shared_ptr<detail::cardinal_cubic_hermite_detail<RandomAccessContainer>> impl_;95};96 97 98template<class RandomAccessContainer>99class cardinal_cubic_hermite_aos {100public:101 using Point = typename RandomAccessContainer::value_type;102 using Real = typename Point::value_type;103 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 {}107 108 inline Real operator()(Real x) const109 {110 return impl_->operator()(x);111 }112 113 inline Real prime(Real x) const114 {115 return impl_->prime(x);116 }117 118 friend std::ostream& operator<<(std::ostream & os, const cardinal_cubic_hermite_aos & m)119 {120 os << *m.impl_;121 return os;122 }123 124 int64_t bytes() const125 {126 return impl_->bytes() + sizeof(impl_);127 }128 129 std::pair<Real, Real> domain() const130 {131 return impl_->domain();132 }133 134private:135 std::shared_ptr<detail::cardinal_cubic_hermite_detail_aos<RandomAccessContainer>> impl_;136};137 138}139}140}141#endif142