brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 48346ab Raw
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