1 //  (C) Copyright John Maddock 2006.
2 //  (C) Copyright Paul A. Bristow 2006.
3 //  Use, modification and distribution are subject to the
4 //  Boost Software License, Version 1.0. (See accompanying file
5 //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 
7 #ifndef BOOST_STATS_COMPLEMENT_HPP
8 #define BOOST_STATS_COMPLEMENT_HPP
9 
10 //
11 // This code really defines our own tuple type.
12 // It would be nice to reuse boost::math::tuple
13 // while retaining our own type safety, but it's
14 // not clear if that's possible.  In any case this
15 // code is *very* lightweight.
16 //
17 namespace boost{ namespace math{
18 
19 template <class Dist, class RealType>
20 struct complemented2_type
21 {
complemented2_typeboost::math::complemented2_type22    complemented2_type(
23       const Dist& d,
24       const RealType& p1)
25       : dist(d),
26         param(p1) {}
27 
28    const Dist& dist;
29    const RealType& param;
30 
31 private:
32    complemented2_type& operator=(const complemented2_type&);
33 };
34 
35 template <class Dist, class RealType1, class RealType2>
36 struct complemented3_type
37 {
complemented3_typeboost::math::complemented3_type38    complemented3_type(
39       const Dist& d,
40       const RealType1& p1,
41       const RealType2& p2)
42       : dist(d),
43         param1(p1),
44         param2(p2) {}
45 
46    const Dist& dist;
47    const RealType1& param1;
48    const RealType2& param2;
49 private:
50    complemented3_type& operator=(const complemented3_type&);
51 };
52 
53 template <class Dist, class RealType1, class RealType2, class RealType3>
54 struct complemented4_type
55 {
complemented4_typeboost::math::complemented4_type56    complemented4_type(
57       const Dist& d,
58       const RealType1& p1,
59       const RealType2& p2,
60       const RealType3& p3)
61       : dist(d),
62         param1(p1),
63         param2(p2),
64         param3(p3) {}
65 
66    const Dist& dist;
67    const RealType1& param1;
68    const RealType2& param2;
69    const RealType3& param3;
70 private:
71    complemented4_type& operator=(const complemented4_type&);
72 };
73 
74 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
75 struct complemented5_type
76 {
complemented5_typeboost::math::complemented5_type77    complemented5_type(
78       const Dist& d,
79       const RealType1& p1,
80       const RealType2& p2,
81       const RealType3& p3,
82       const RealType4& p4)
83       : dist(d),
84         param1(p1),
85         param2(p2),
86         param3(p3),
87         param4(p4) {}
88 
89    const Dist& dist;
90    const RealType1& param1;
91    const RealType2& param2;
92    const RealType3& param3;
93    const RealType4& param4;
94 private:
95    complemented5_type& operator=(const complemented5_type&);
96 };
97 
98 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
99 struct complemented6_type
100 {
complemented6_typeboost::math::complemented6_type101    complemented6_type(
102       const Dist& d,
103       const RealType1& p1,
104       const RealType2& p2,
105       const RealType3& p3,
106       const RealType4& p4,
107       const RealType5& p5)
108       : dist(d),
109         param1(p1),
110         param2(p2),
111         param3(p3),
112         param4(p4),
113         param5(p5) {}
114 
115    const Dist& dist;
116    const RealType1& param1;
117    const RealType2& param2;
118    const RealType3& param3;
119    const RealType4& param4;
120    const RealType5& param5;
121 private:
122    complemented6_type& operator=(const complemented6_type&);
123 };
124 
125 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
126 struct complemented7_type
127 {
complemented7_typeboost::math::complemented7_type128    complemented7_type(
129       const Dist& d,
130       const RealType1& p1,
131       const RealType2& p2,
132       const RealType3& p3,
133       const RealType4& p4,
134       const RealType5& p5,
135       const RealType6& p6)
136       : dist(d),
137         param1(p1),
138         param2(p2),
139         param3(p3),
140         param4(p4),
141         param5(p5),
142         param6(p6) {}
143 
144    const Dist& dist;
145    const RealType1& param1;
146    const RealType2& param2;
147    const RealType3& param3;
148    const RealType4& param4;
149    const RealType5& param5;
150    const RealType6& param6;
151 private:
152    complemented7_type& operator=(const complemented7_type&);
153 };
154 
155 template <class Dist, class RealType>
complement(const Dist & d,const RealType & r)156 inline complemented2_type<Dist, RealType> complement(const Dist& d, const RealType& r)
157 {
158    return complemented2_type<Dist, RealType>(d, r);
159 }
160 
161 template <class Dist, class RealType1, class RealType2>
complement(const Dist & d,const RealType1 & r1,const RealType2 & r2)162 inline complemented3_type<Dist, RealType1, RealType2> complement(const Dist& d, const RealType1& r1, const RealType2& r2)
163 {
164    return complemented3_type<Dist, RealType1, RealType2>(d, r1, r2);
165 }
166 
167 template <class Dist, class RealType1, class RealType2, class RealType3>
complement(const Dist & d,const RealType1 & r1,const RealType2 & r2,const RealType3 & r3)168 inline complemented4_type<Dist, RealType1, RealType2, RealType3> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3)
169 {
170    return complemented4_type<Dist, RealType1, RealType2, RealType3>(d, r1, r2, r3);
171 }
172 
173 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4>
complement(const Dist & d,const RealType1 & r1,const RealType2 & r2,const RealType3 & r3,const RealType4 & r4)174 inline complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4)
175 {
176    return complemented5_type<Dist, RealType1, RealType2, RealType3, RealType4>(d, r1, r2, r3, r4);
177 }
178 
179 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5>
complement(const Dist & d,const RealType1 & r1,const RealType2 & r2,const RealType3 & r3,const RealType4 & r4,const RealType5 & r5)180 inline complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5)
181 {
182    return complemented6_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5>(d, r1, r2, r3, r4, r5);
183 }
184 
185 template <class Dist, class RealType1, class RealType2, class RealType3, class RealType4, class RealType5, class RealType6>
complement(const Dist & d,const RealType1 & r1,const RealType2 & r2,const RealType3 & r3,const RealType4 & r4,const RealType5 & r5,const RealType6 & r6)186 inline complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6> complement(const Dist& d, const RealType1& r1, const RealType2& r2, const RealType3& r3, const RealType4& r4, const RealType5& r5, const RealType6& r6)
187 {
188    return complemented7_type<Dist, RealType1, RealType2, RealType3, RealType4, RealType5, RealType6>(d, r1, r2, r3, r4, r5, r6);
189 }
190 
191 } // namespace math
192 } // namespace boost
193 
194 #endif // BOOST_STATS_COMPLEMENT_HPP
195 
196