]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/math/special_functions/bessel_iterators.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / math / special_functions / bessel_iterators.hpp
CommitLineData
92f5a8d4
TL
1
2///////////////////////////////////////////////////////////////////////////////
3// Copyright 2018 John Maddock
4// Distributed under the Boost
5// Software License, Version 1.0. (See accompanying file
6// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7
8#ifndef BOOST_MATH_BESSEL_ITERATORS_HPP
9#define BOOST_MATH_BESSEL_ITERATORS_HPP
10
11#include <boost/math/tools/recurrence.hpp>
12
13namespace boost {
14 namespace math {
15 namespace detail {
16
17 template <class T>
18 struct bessel_jy_recurrence
19 {
20 bessel_jy_recurrence(T v, T z) : v(v), z(z) {}
21 boost::math::tuple<T, T, T> operator()(int k)
22 {
23 return boost::math::tuple<T, T, T>(1, -2 * (v + k) / z, 1);
24 }
25
26 T v, z;
27 };
28 template <class T>
29 struct bessel_ik_recurrence
30 {
31 bessel_ik_recurrence(T v, T z) : v(v), z(z) {}
32 boost::math::tuple<T, T, T> operator()(int k)
33 {
34 return boost::math::tuple<T, T, T>(1, -2 * (v + k) / z, -1);
35 }
36
37 T v, z;
38 };
39 } // namespace detail
40
20effc67 41 template <class T, class Policy = boost::math::policies::policy<> >
92f5a8d4
TL
42 struct bessel_j_backwards_iterator
43 {
44 typedef std::ptrdiff_t difference_type;
45 typedef T value_type;
46 typedef T* pointer;
47 typedef T& reference;
48 typedef std::input_iterator_tag iterator_category;
49
50 bessel_j_backwards_iterator(const T& v, const T& x)
20effc67 51 : it(detail::bessel_jy_recurrence<T>(v, x), boost::math::cyl_bessel_j(v, x, Policy()))
92f5a8d4
TL
52 {
53 if(v < 0)
20effc67 54 boost::math::policies::raise_domain_error("bessel_j_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
55 }
56
57 bessel_j_backwards_iterator(const T& v, const T& x, const T& J_v)
58 : it(detail::bessel_jy_recurrence<T>(v, x), J_v)
59 {
60 if(v < 0)
20effc67 61 boost::math::policies::raise_domain_error("bessel_j_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
62 }
63 bessel_j_backwards_iterator(const T& v, const T& x, const T& J_v_plus_1, const T& J_v)
64 : it(detail::bessel_jy_recurrence<T>(v, x), J_v_plus_1, J_v)
65 {
66 if (v < -1)
20effc67 67 boost::math::policies::raise_domain_error("bessel_j_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
68 }
69
70 bessel_j_backwards_iterator& operator++()
71 {
72 ++it;
73 return *this;
74 }
75
76 bessel_j_backwards_iterator operator++(int)
77 {
78 bessel_j_backwards_iterator t(*this);
79 ++(*this);
80 return t;
81 }
82
83 T operator*() { return *it; }
84
85 private:
86 boost::math::tools::backward_recurrence_iterator< detail::bessel_jy_recurrence<T> > it;
87 };
88
20effc67 89 template <class T, class Policy = boost::math::policies::policy<> >
92f5a8d4
TL
90 struct bessel_i_backwards_iterator
91 {
92 typedef std::ptrdiff_t difference_type;
93 typedef T value_type;
94 typedef T* pointer;
95 typedef T& reference;
96 typedef std::input_iterator_tag iterator_category;
97
98 bessel_i_backwards_iterator(const T& v, const T& x)
20effc67 99 : it(detail::bessel_ik_recurrence<T>(v, x), boost::math::cyl_bessel_i(v, x, Policy()))
92f5a8d4
TL
100 {
101 if(v < -1)
20effc67 102 boost::math::policies::raise_domain_error("bessel_i_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
103 }
104 bessel_i_backwards_iterator(const T& v, const T& x, const T& I_v)
105 : it(detail::bessel_ik_recurrence<T>(v, x), I_v)
106 {
107 if(v < -1)
20effc67 108 boost::math::policies::raise_domain_error("bessel_i_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
109 }
110 bessel_i_backwards_iterator(const T& v, const T& x, const T& I_v_plus_1, const T& I_v)
111 : it(detail::bessel_ik_recurrence<T>(v, x), I_v_plus_1, I_v)
112 {
113 if(v < -1)
20effc67 114 boost::math::policies::raise_domain_error("bessel_i_backwards_iterator<%1%>", "Order must be > 0 stable backwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
115 }
116
117 bessel_i_backwards_iterator& operator++()
118 {
119 ++it;
120 return *this;
121 }
122
123 bessel_i_backwards_iterator operator++(int)
124 {
125 bessel_i_backwards_iterator t(*this);
126 ++(*this);
127 return t;
128 }
129
130 T operator*() { return *it; }
131
132 private:
133 boost::math::tools::backward_recurrence_iterator< detail::bessel_ik_recurrence<T> > it;
134 };
135
20effc67 136 template <class T, class Policy = boost::math::policies::policy<> >
92f5a8d4
TL
137 struct bessel_i_forwards_iterator
138 {
139 typedef std::ptrdiff_t difference_type;
140 typedef T value_type;
141 typedef T* pointer;
142 typedef T& reference;
143 typedef std::input_iterator_tag iterator_category;
144
145 bessel_i_forwards_iterator(const T& v, const T& x)
20effc67 146 : it(detail::bessel_ik_recurrence<T>(v, x), boost::math::cyl_bessel_i(v, x, Policy()))
92f5a8d4
TL
147 {
148 if(v > 1)
20effc67 149 boost::math::policies::raise_domain_error("bessel_i_forwards_iterator<%1%>", "Order must be < 0 stable forwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
150 }
151 bessel_i_forwards_iterator(const T& v, const T& x, const T& I_v)
152 : it(detail::bessel_ik_recurrence<T>(v, x), I_v)
153 {
154 if (v > 1)
20effc67 155 boost::math::policies::raise_domain_error("bessel_i_forwards_iterator<%1%>", "Order must be < 0 stable forwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
156 }
157 bessel_i_forwards_iterator(const T& v, const T& x, const T& I_v_plus_1, const T& I_v)
158 : it(detail::bessel_ik_recurrence<T>(v, x), I_v_plus_1, I_v)
159 {
160 if (v > 1)
20effc67 161 boost::math::policies::raise_domain_error("bessel_i_forwards_iterator<%1%>", "Order must be < 0 stable forwards recurrence but got %1%", v, Policy());
92f5a8d4
TL
162 }
163
164 bessel_i_forwards_iterator& operator++()
165 {
166 ++it;
167 return *this;
168 }
169
170 bessel_i_forwards_iterator operator++(int)
171 {
172 bessel_i_forwards_iterator t(*this);
173 ++(*this);
174 return t;
175 }
176
177 T operator*() { return *it; }
178
179 private:
180 boost::math::tools::forward_recurrence_iterator< detail::bessel_ik_recurrence<T> > it;
181 };
182
183 }
184} // namespaces
185
186#endif // BOOST_MATH_BESSEL_ITERATORS_HPP