brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.6 KiB · f428a76 Raw
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