• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 ///////////////////////////////////////////////////////////////
2 //  Copyright 2020 John Maddock. Distributed under the Boost
3 //  Software License, Version 1.0. (See accompanying file
4 //  LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt
5 
6 #ifndef BOOST_MATH_SKELETON_BACKEND_HPP
7 #define BOOST_MATH_SKELETON_BACKEND_HPP
8 
9 #include <boost/multiprecision/number.hpp>
10 #include <boost/container_hash/hash.hpp>
11 
12 namespace boost {
13 namespace multiprecision {
14 namespace backends {
15 
16 /*
17 This header defines one type - skeleton_backend - which declares the minimal
18 interface to qualify as a backend for class number.  In addition you'll find
19 optional interfaces declared commented out - you can enable these or not as
20 needed.
21 
22 The process of writing a new backend for class number then reduces to a search
23 and replace to change the name of this class to something meaningful, followed
24 by "filling in the blanks" of each of the methods.
25 
26 NOTE: all of the methods shown below are simple declarations, be sure to make them
27 inline, constexpr and/or noexcept as appropriate - as these annotations propogate
28 upwards to operations on number<>'s.
29 
30 If the backend is to be itself a template, thn you will have rather more editing to
31 do to add all the "template<...>" prefixes to the functions.
32 
33 */
34 
35 
36 struct skeleton_backend
37 {
38    //
39    // Each backend need to declare 3 type lists which declare the types
40    // with which this can interoperate.  These lists must at least contain
41    // the widest type in each category - so "long long" must be the final
42    // type in the signed_types list for example.  Any narrower types if not
43    // present in the list will get promoted to the next wider type that is
44    // in the list whenever mixed arithmetic involving that type is encountered.
45    //
46    typedef mpl::list</*signed char, short, int, long,*/ long long>                                     signed_types;
47    typedef mpl::list</* unsigned char, unsigned short, unsigned, unsigned long,*/ unsigned long long>  unsigned_types;
48    typedef mpl::list</*float, double,*/ long double>                                                   float_types;
49    //
50    // This typedef is only required if this is a floating point type, it is the type
51    // which holds the exponent:
52    //
53    typedef int                                                         exponent_type;
54 
55    // We must have a default constructor:
56    skeleton_backend();
57    skeleton_backend(const skeleton_backend& o);
58 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
59    skeleton_backend(skeleton_backend&& o);
60 #endif
61 
62    // Optional constructors, we can make this type slightly more efficient
63    // by providing constructors from any type we can handle natively.
64    // These will also cause number<> to be implicitly constructible
65    // from these types unless we make such constructors explicit.
66    //
67    // skeleton_backend(int o);  // If there's an efficient initialisation from int for example.
68 
69    //
70    // In the absense of converting constructors, operator= takes the strain.
71    // In addition to the usual suspects, there must be one operator= for each type
72    // listed in signed_types, unsigned_types, and float_types plus a string constructor.
73    //
74    skeleton_backend& operator=(const skeleton_backend& o);
75 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
76    skeleton_backend& operator=(skeleton_backend&& o);
77 #endif
78    skeleton_backend& operator=(unsigned long long i);
79    skeleton_backend& operator=(long long i);
80    skeleton_backend& operator=(long double i);
81    skeleton_backend& operator=(const char* s);
82 
83    void swap(skeleton_backend& o);
84    std::string str(std::streamsize digits, std::ios_base::fmtflags f) const;
85    void        negate();
86    int         compare(const skeleton_backend& o) const;
87    //
88    // Comparison with arithmetic types, default just constructs a temporary:
89    //
90    template <class A>
compareboost::multiprecision::backends::skeleton_backend91    typename enable_if<is_arithmetic<A>, int>::type compare(A i) const
92    {
93       skeleton_backend t;
94       t = i;  //  Note: construct directly from i if supported.
95       return compare(t);
96    }
97 };
98 
99 //
100 // Required non-members:
101 //
102 void eval_add(skeleton_backend& a, const skeleton_backend& b);
103 void eval_subtract(skeleton_backend& a, const skeleton_backend& b);
104 void eval_multiply(skeleton_backend& a, const skeleton_backend& b);
105 void eval_divide(skeleton_backend& a, const skeleton_backend& b);
106 //
107 // Required only for integer types:
108 //
109 void eval_modulus(skeleton_backend& a, const skeleton_backend& b);
110 void eval_bitwise_and(skeleton_backend& a, const skeleton_backend& b);
111 void eval_bitwise_or(skeleton_backend& a, const skeleton_backend& b);
112 void eval_bitwise_xor(skeleton_backend& a, const skeleton_backend& b);
113 void eval_complement(skeleton_backend& a, const skeleton_backend& b);
114 void eval_left_shift(skeleton_backend& a, unsigned shift);
115 void eval_right_shift(skeleton_backend& a, unsigned shift);
116 //
117 // Conversions: must include at least unsigned long long, long long and long double.
118 // Everything else is entirely optional:
119 //
120 void eval_convert_to(unsigned long long* result, const skeleton_backend& backend);
121 void eval_convert_to(long long* result, const skeleton_backend& backend);
122 void eval_convert_to(long double* result, const skeleton_backend& backend);
123 
124 //void eval_convert_to(unsigned long* result, const skeleton_backend& backend);
125 //void eval_convert_to(unsigned* result, const skeleton_backend& backend);
126 //void eval_convert_to(unsigned short* result, const skeleton_backend& backend);
127 //void eval_convert_to(unsigned char* result, const skeleton_backend& backend);
128 
129 //void eval_convert_to(char* result, const skeleton_backend& backend);
130 
131 //void eval_convert_to(long* result, const skeleton_backend& backend);
132 //void eval_convert_to(int* result, const skeleton_backend& backend);
133 //void eval_convert_to(short* result, const skeleton_backend& backend);
134 //void eval_convert_to(signed char* result, const skeleton_backend& backend);
135 
136 //void eval_convert_to(double* result, const skeleton_backend& backend);
137 //void eval_convert_to(float* result, const skeleton_backend& backend);
138 
139 //
140 // Operations which are required *only* if we have a floating point type:
141 //
142 void eval_frexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type* p_exponent);
143 void eval_frexp(skeleton_backend& result, const skeleton_backend& arg, int* p_exponent);  // throws a runtime_error if the exponent is too large for an int
144 void eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type exponent);
145 void eval_ldexp(skeleton_backend& result, const skeleton_backend& arg, int exponent);
146 void eval_floor(skeleton_backend& result, const skeleton_backend& arg);
147 void eval_ceil(skeleton_backend& result, const skeleton_backend& arg);
148 void eval_sqrt(skeleton_backend& result, const skeleton_backend& arg);
149 //
150 // Operations defined *only* if we have a complex number type, type
151 // skeleton_real_type is assumed to be the real number type matching
152 // this type.
153 //
154 void eval_conj(skeleton_backend& result, const skeleton_backend& arg);
155 void eval_proj(skeleton_backend& result, const skeleton_backend& arg);
156 //void eval_real(skeleton_real_type& result, const skeleton_backend& arg);
157 //void eval_set_real(skeleton_real_type& result, const skeleton_backend& arg);
158 //void eval_imag(skeleton_real_type& result, const skeleton_backend& arg);
159 //void eval_set_real(skeleton_type& result, const skeleton_real_type& arg);
160 //void eval_set_imag(skeleton_type& result, const skeleton_real_type& arg);
161 
162 //
163 // Hashing support, not strictly required, but it is used in our tests:
164 //
165 std::size_t hash_value(const skeleton_backend& arg);
166 //
167 // We're now into strictly optional requirements, everything that follows is
168 // nice to have, but can be synthesised from the operators above if required.
169 // Typically these operations are here to improve performance and reduce the
170 // number of temporaries created.
171 //
172 // assign_components: required number types with 2 seperate components (rationals and complex numbers).
173 // Type skeleton_component_type is whatever the corresponding backend type for the components is:
174 //
175 //void assign_conponents(skeleton_backend& result, skeleton_component_type const& a, skeleton_component_type const& b);
176 //
177 // Again for arithmetic types, overload for whatever arithmetic types are directly supported:
178 //
179 //void assign_conponents(skeleton_backend& result, double a, double b);
180 //
181 // Optional comparison operators:
182 //
183 #if 0
184 
185 bool eval_is_zero(const skeleton_backend& arg);
186 int eval_get_sign(const skeleton_backend& arg);
187 
188 bool eval_eq(const skeleton_backend& a, const skeleton_backend& b);
189 bool eval_eq(const skeleton_backend& a, unsigned long long b);
190 bool eval_eq(const skeleton_backend& a, unsigned long b);
191 bool eval_eq(const skeleton_backend& a, unsigned b);
192 bool eval_eq(const skeleton_backend& a, unsigned short b);
193 bool eval_eq(const skeleton_backend& a, unsigned char b);
194 bool eval_eq(const skeleton_backend& a, long long b);
195 bool eval_eq(const skeleton_backend& a, long b);
196 bool eval_eq(const skeleton_backend& a, int b);
197 bool eval_eq(const skeleton_backend& a, short b);
198 bool eval_eq(const skeleton_backend& a, signed char b);
199 bool eval_eq(const skeleton_backend& a, char b);
200 bool eval_eq(const skeleton_backend& a, long double b);
201 bool eval_eq(const skeleton_backend& a, double b);
202 bool eval_eq(const skeleton_backend& a, float b);
203 
204 bool eval_eq(unsigned long long a, const skeleton_backend& b);
205 bool eval_eq(unsigned long a, const skeleton_backend& b);
206 bool eval_eq(unsigned a, const skeleton_backend& b);
207 bool eval_eq(unsigned short a, const skeleton_backend& b);
208 bool eval_eq(unsigned char a, const skeleton_backend& b);
209 bool eval_eq(long long a, const skeleton_backend& b);
210 bool eval_eq(long a, const skeleton_backend& b);
211 bool eval_eq(int a, const skeleton_backend& b);
212 bool eval_eq(short a, const skeleton_backend& b);
213 bool eval_eq(signed char a, const skeleton_backend& b);
214 bool eval_eq(char a, const skeleton_backend& b);
215 bool eval_eq(long double a, const skeleton_backend& b);
216 bool eval_eq(double a, const skeleton_backend& b);
217 bool eval_eq(float a, const skeleton_backend& b);
218 
219 bool eval_lt(const skeleton_backend& a, const skeleton_backend& b);
220 bool eval_lt(const skeleton_backend& a, unsigned long long b);
221 bool eval_lt(const skeleton_backend& a, unsigned long b);
222 bool eval_lt(const skeleton_backend& a, unsigned b);
223 bool eval_lt(const skeleton_backend& a, unsigned short b);
224 bool eval_lt(const skeleton_backend& a, unsigned char b);
225 bool eval_lt(const skeleton_backend& a, long long b);
226 bool eval_lt(const skeleton_backend& a, long b);
227 bool eval_lt(const skeleton_backend& a, int b);
228 bool eval_lt(const skeleton_backend& a, short b);
229 bool eval_lt(const skeleton_backend& a, signed char b);
230 bool eval_lt(const skeleton_backend& a, char b);
231 bool eval_lt(const skeleton_backend& a, long double b);
232 bool eval_lt(const skeleton_backend& a, double b);
233 bool eval_lt(const skeleton_backend& a, float b);
234 
235 bool eval_lt(unsigned long long a, const skeleton_backend& b);
236 bool eval_lt(unsigned long a, const skeleton_backend& b);
237 bool eval_lt(unsigned a, const skeleton_backend& b);
238 bool eval_lt(unsigned short a, const skeleton_backend& b);
239 bool eval_lt(unsigned char a, const skeleton_backend& b);
240 bool eval_lt(long long a, const skeleton_backend& b);
241 bool eval_lt(long a, const skeleton_backend& b);
242 bool eval_lt(int a, const skeleton_backend& b);
243 bool eval_lt(short a, const skeleton_backend& b);
244 bool eval_lt(signed char a, const skeleton_backend& b);
245 bool eval_lt(char a, const skeleton_backend& b);
246 bool eval_lt(long double a, const skeleton_backend& b);
247 bool eval_lt(double a, const skeleton_backend& b);
248 bool eval_lt(float a, const skeleton_backend& b);
249 
250 bool eval_gt(const skeleton_backend& a, const skeleton_backend& b);
251 bool eval_gt(const skeleton_backend& a, unsigned long long b);
252 bool eval_gt(const skeleton_backend& a, unsigned long b);
253 bool eval_gt(const skeleton_backend& a, unsigned b);
254 bool eval_gt(const skeleton_backend& a, unsigned short b);
255 bool eval_gt(const skeleton_backend& a, unsigned char b);
256 bool eval_gt(const skeleton_backend& a, long long b);
257 bool eval_gt(const skeleton_backend& a, long b);
258 bool eval_gt(const skeleton_backend& a, int b);
259 bool eval_gt(const skeleton_backend& a, short b);
260 bool eval_gt(const skeleton_backend& a, signed char b);
261 bool eval_gt(const skeleton_backend& a, char b);
262 bool eval_gt(const skeleton_backend& a, long double b);
263 bool eval_gt(const skeleton_backend& a, double b);
264 bool eval_gt(const skeleton_backend& a, float b);
265 
266 bool eval_gt(unsigned long long a, const skeleton_backend& b);
267 bool eval_gt(unsigned long a, const skeleton_backend& b);
268 bool eval_gt(unsigned a, const skeleton_backend& b);
269 bool eval_gt(unsigned short a, const skeleton_backend& b);
270 bool eval_gt(unsigned char a, const skeleton_backend& b);
271 bool eval_gt(long long a, const skeleton_backend& b);
272 bool eval_gt(long a, const skeleton_backend& b);
273 bool eval_gt(int a, const skeleton_backend& b);
274 bool eval_gt(short a, const skeleton_backend& b);
275 bool eval_gt(signed char a, const skeleton_backend& b);
276 bool eval_gt(char a, const skeleton_backend& b);
277 bool eval_gt(long double a, const skeleton_backend& b);
278 bool eval_gt(double a, const skeleton_backend& b);
279 bool eval_gt(float a, const skeleton_backend& b);
280 #endif
281 
282 //
283 // Arithmetic operations, starting with addition:
284 //
285 #if 0
286 void eval_add(skeleton_backend& result, unsigned long long arg);
287 void eval_add(skeleton_backend& result, unsigned long arg);
288 void eval_add(skeleton_backend& result, unsigned arg);
289 void eval_add(skeleton_backend& result, unsigned short arg);
290 void eval_add(skeleton_backend& result, unsigned char arg);
291 void eval_add(skeleton_backend& result, char arg);
292 void eval_add(skeleton_backend& result, long long arg);
293 void eval_add(skeleton_backend& result, long arg);
294 void eval_add(skeleton_backend& result, int arg);
295 void eval_add(skeleton_backend& result, short arg);
296 void eval_add(skeleton_backend& result, signed char arg);
297 void eval_add(skeleton_backend& result, long double arg);
298 void eval_add(skeleton_backend& result, double arg);
299 void eval_add(skeleton_backend& result, float arg);
300 
301 void eval_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
302 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
303 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
304 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned b);
305 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
306 void eval_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
307 void eval_add(skeleton_backend& result, const skeleton_backend& a, long long b);
308 void eval_add(skeleton_backend& result, const skeleton_backend& a, long b);
309 void eval_add(skeleton_backend& result, const skeleton_backend& a, int b);
310 void eval_add(skeleton_backend& result, const skeleton_backend& a, short b);
311 void eval_add(skeleton_backend& result, const skeleton_backend& a, signed char b);
312 void eval_add(skeleton_backend& result, const skeleton_backend& a, char b);
313 void eval_add(skeleton_backend& result, const skeleton_backend& a, long double b);
314 void eval_add(skeleton_backend& result, const skeleton_backend& a, double b);
315 void eval_add(skeleton_backend& result, const skeleton_backend& a, float b);
316 
317 void eval_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
318 void eval_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
319 void eval_add(skeleton_backend& result, unsigned b, const skeleton_backend& a);
320 void eval_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
321 void eval_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
322 void eval_add(skeleton_backend& result, long long b, const skeleton_backend& a);
323 void eval_add(skeleton_backend& result, long b, const skeleton_backend& a);
324 void eval_add(skeleton_backend& result, int b, const skeleton_backend& a);
325 void eval_add(skeleton_backend& result, short b, const skeleton_backend& a);
326 void eval_add(skeleton_backend& result, signed char b, const skeleton_backend& a);
327 void eval_add(skeleton_backend& result, char b, const skeleton_backend& a);
328 void eval_add(skeleton_backend& result, long double b, const skeleton_backend& a);
329 void eval_add(skeleton_backend& result, double b, const skeleton_backend& a);
330 void eval_add(skeleton_backend& result, float b, const skeleton_backend& a);
331 #endif
332 
333 //
334 // Subtraction:
335 //
336 #if 0
337 void eval_subtract(skeleton_backend& result, unsigned long long arg);
338 void eval_subtract(skeleton_backend& result, unsigned long arg);
339 void eval_subtract(skeleton_backend& result, unsigned arg);
340 void eval_subtract(skeleton_backend& result, unsigned short arg);
341 void eval_subtract(skeleton_backend& result, unsigned char arg);
342 void eval_subtract(skeleton_backend& result, char arg);
343 void eval_subtract(skeleton_backend& result, long long arg);
344 void eval_subtract(skeleton_backend& result, long arg);
345 void eval_subtract(skeleton_backend& result, int arg);
346 void eval_subtract(skeleton_backend& result, short arg);
347 void eval_subtract(skeleton_backend& result, signed char arg);
348 void eval_subtract(skeleton_backend& result, long double arg);
349 void eval_subtract(skeleton_backend& result, double arg);
350 void eval_subtract(skeleton_backend& result, float arg);
351 
352 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
353 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
354 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
355 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b);
356 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
357 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
358 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long long b);
359 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long b);
360 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, int b);
361 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, short b);
362 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b);
363 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, char b);
364 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, long double b);
365 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, double b);
366 void eval_subtract(skeleton_backend& result, const skeleton_backend& a, float b);
367 
368 void eval_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
369 void eval_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
370 void eval_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a);
371 void eval_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
372 void eval_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
373 void eval_subtract(skeleton_backend& result, long long b, const skeleton_backend& a);
374 void eval_subtract(skeleton_backend& result, long b, const skeleton_backend& a);
375 void eval_subtract(skeleton_backend& result, int b, const skeleton_backend& a);
376 void eval_subtract(skeleton_backend& result, short b, const skeleton_backend& a);
377 void eval_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a);
378 void eval_subtract(skeleton_backend& result, char b, const skeleton_backend& a);
379 void eval_subtract(skeleton_backend& result, long double b, const skeleton_backend& a);
380 void eval_subtract(skeleton_backend& result, double b, const skeleton_backend& a);
381 void eval_subtract(skeleton_backend& result, float b, const skeleton_backend& a);
382 #endif
383 
384 //
385 // Multiplication:
386 //
387 #if 0
388 void eval_multiply(skeleton_backend& result, unsigned long long arg);
389 void eval_multiply(skeleton_backend& result, unsigned long arg);
390 void eval_multiply(skeleton_backend& result, unsigned arg);
391 void eval_multiply(skeleton_backend& result, unsigned short arg);
392 void eval_multiply(skeleton_backend& result, unsigned char arg);
393 void eval_multiply(skeleton_backend& result, char arg);
394 void eval_multiply(skeleton_backend& result, long long arg);
395 void eval_multiply(skeleton_backend& result, long arg);
396 void eval_multiply(skeleton_backend& result, int arg);
397 void eval_multiply(skeleton_backend& result, short arg);
398 void eval_multiply(skeleton_backend& result, signed char arg);
399 void eval_multiply(skeleton_backend& result, long double arg);
400 void eval_multiply(skeleton_backend& result, double arg);
401 void eval_multiply(skeleton_backend& result, float arg);
402 
403 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
404 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
405 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
406 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned b);
407 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
408 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
409 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long long b);
410 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long b);
411 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, int b);
412 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, short b);
413 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, signed char b);
414 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, char b);
415 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, long double b);
416 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, double b);
417 void eval_multiply(skeleton_backend& result, const skeleton_backend& a, float b);
418 
419 void eval_multiply(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
420 void eval_multiply(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
421 void eval_multiply(skeleton_backend& result, unsigned b, const skeleton_backend& a);
422 void eval_multiply(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
423 void eval_multiply(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
424 void eval_multiply(skeleton_backend& result, long long b, const skeleton_backend& a);
425 void eval_multiply(skeleton_backend& result, long b, const skeleton_backend& a);
426 void eval_multiply(skeleton_backend& result, int b, const skeleton_backend& a);
427 void eval_multiply(skeleton_backend& result, short b, const skeleton_backend& a);
428 void eval_multiply(skeleton_backend& result, signed char b, const skeleton_backend& a);
429 void eval_multiply(skeleton_backend& result, char b, const skeleton_backend& a);
430 void eval_multiply(skeleton_backend& result, long double b, const skeleton_backend& a);
431 void eval_multiply(skeleton_backend& result, double b, const skeleton_backend& a);
432 void eval_multiply(skeleton_backend& result, float b, const skeleton_backend& a);
433 #endif
434 
435 //
436 // Division:
437 //
438 #if 0
439 void eval_divide(skeleton_backend& result, unsigned long long arg);
440 void eval_divide(skeleton_backend& result, unsigned long arg);
441 void eval_divide(skeleton_backend& result, unsigned arg);
442 void eval_divide(skeleton_backend& result, unsigned short arg);
443 void eval_divide(skeleton_backend& result, unsigned char arg);
444 void eval_divide(skeleton_backend& result, char arg);
445 void eval_divide(skeleton_backend& result, long long arg);
446 void eval_divide(skeleton_backend& result, long arg);
447 void eval_divide(skeleton_backend& result, int arg);
448 void eval_divide(skeleton_backend& result, short arg);
449 void eval_divide(skeleton_backend& result, signed char arg);
450 void eval_divide(skeleton_backend& result, long double arg);
451 void eval_divide(skeleton_backend& result, double arg);
452 void eval_divide(skeleton_backend& result, float arg);
453 
454 void eval_divide(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
455 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
456 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
457 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned b);
458 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
459 void eval_divide(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
460 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long long b);
461 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long b);
462 void eval_divide(skeleton_backend& result, const skeleton_backend& a, int b);
463 void eval_divide(skeleton_backend& result, const skeleton_backend& a, short b);
464 void eval_divide(skeleton_backend& result, const skeleton_backend& a, signed char b);
465 void eval_divide(skeleton_backend& result, const skeleton_backend& a, char b);
466 void eval_divide(skeleton_backend& result, const skeleton_backend& a, long double b);
467 void eval_divide(skeleton_backend& result, const skeleton_backend& a, double b);
468 void eval_divide(skeleton_backend& result, const skeleton_backend& a, float b);
469 
470 void eval_divide(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
471 void eval_divide(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
472 void eval_divide(skeleton_backend& result, unsigned b, const skeleton_backend& a);
473 void eval_divide(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
474 void eval_divide(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
475 void eval_divide(skeleton_backend& result, long long b, const skeleton_backend& a);
476 void eval_divide(skeleton_backend& result, long b, const skeleton_backend& a);
477 void eval_divide(skeleton_backend& result, int b, const skeleton_backend& a);
478 void eval_divide(skeleton_backend& result, short b, const skeleton_backend& a);
479 void eval_divide(skeleton_backend& result, signed char b, const skeleton_backend& a);
480 void eval_divide(skeleton_backend& result, char b, const skeleton_backend& a);
481 void eval_divide(skeleton_backend& result, long double b, const skeleton_backend& a);
482 void eval_divide(skeleton_backend& result, double b, const skeleton_backend& a);
483 void eval_divide(skeleton_backend& result, float b, const skeleton_backend& a);
484 #endif
485 //
486 // Multiply and add/subtract as one:
487 //
488 #if 0
489 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
490 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
491 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
492 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned b);
493 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
494 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
495 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long long b);
496 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long b);
497 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, int b);
498 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, short b);
499 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, signed char b);
500 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, char b);
501 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, long double b);
502 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, double b);
503 void eval_multiply_add(skeleton_backend& result, const skeleton_backend& a, float b);
504 
505 void eval_multiply_add(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
506 void eval_multiply_add(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
507 void eval_multiply_add(skeleton_backend& result, unsigned b, const skeleton_backend& a);
508 void eval_multiply_add(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
509 void eval_multiply_add(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
510 void eval_multiply_add(skeleton_backend& result, long long b, const skeleton_backend& a);
511 void eval_multiply_add(skeleton_backend& result, long b, const skeleton_backend& a);
512 void eval_multiply_add(skeleton_backend& result, int b, const skeleton_backend& a);
513 void eval_multiply_add(skeleton_backend& result, short b, const skeleton_backend& a);
514 void eval_multiply_add(skeleton_backend& result, signed char b, const skeleton_backend& a);
515 void eval_multiply_add(skeleton_backend& result, char b, const skeleton_backend& a);
516 void eval_multiply_add(skeleton_backend& result, long double b, const skeleton_backend& a);
517 void eval_multiply_add(skeleton_backend& result, double b, const skeleton_backend& a);
518 void eval_multiply_add(skeleton_backend& result, float b, const skeleton_backend& a);
519 
520 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
521 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
522 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
523 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned b);
524 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
525 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
526 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long long b);
527 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long b);
528 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, int b);
529 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, short b);
530 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, signed char b);
531 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, char b);
532 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, long double b);
533 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, double b);
534 void eval_multiply_subtract(skeleton_backend& result, const skeleton_backend& a, float b);
535 
536 void eval_multiply_subtract(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
537 void eval_multiply_subtract(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
538 void eval_multiply_subtract(skeleton_backend& result, unsigned b, const skeleton_backend& a);
539 void eval_multiply_subtract(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
540 void eval_multiply_subtract(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
541 void eval_multiply_subtract(skeleton_backend& result, long long b, const skeleton_backend& a);
542 void eval_multiply_subtract(skeleton_backend& result, long b, const skeleton_backend& a);
543 void eval_multiply_subtract(skeleton_backend& result, int b, const skeleton_backend& a);
544 void eval_multiply_subtract(skeleton_backend& result, short b, const skeleton_backend& a);
545 void eval_multiply_subtract(skeleton_backend& result, signed char b, const skeleton_backend& a);
546 void eval_multiply_subtract(skeleton_backend& result, char b, const skeleton_backend& a);
547 void eval_multiply_subtract(skeleton_backend& result, long double b, const skeleton_backend& a);
548 void eval_multiply_subtract(skeleton_backend& result, double b, const skeleton_backend& a);
549 void eval_multiply_subtract(skeleton_backend& result, float b, const skeleton_backend& a);
550 #endif
551 //
552 // Increment and decrement:
553 //
554 //void eval_increment(skeleton_backend& arg);
555 //void eval_decrement(skeleton_backend& arg);
556 //
557 // abs/fabs:
558 //
559 // void eval_abs(skeleton_backend& result, const skeleton_backend& arg);
560 // void eval_fabs(skeleton_backend& result, const skeleton_backend& arg);
561 //
562 
563 
564 //
565 // Now operations on Integer types, starting with modulus:
566 //
567 #if 0
568 void eval_modulus(skeleton_backend& result, unsigned long long arg);
569 void eval_modulus(skeleton_backend& result, unsigned long arg);
570 void eval_modulus(skeleton_backend& result, unsigned arg);
571 void eval_modulus(skeleton_backend& result, unsigned short arg);
572 void eval_modulus(skeleton_backend& result, unsigned char arg);
573 void eval_modulus(skeleton_backend& result, char arg);
574 void eval_modulus(skeleton_backend& result, long long arg);
575 void eval_modulus(skeleton_backend& result, long arg);
576 void eval_modulus(skeleton_backend& result, int arg);
577 void eval_modulus(skeleton_backend& result, short arg);
578 void eval_modulus(skeleton_backend& result, signed char arg);
579 void eval_modulus(skeleton_backend& result, long double arg);
580 void eval_modulus(skeleton_backend& result, double arg);
581 void eval_modulus(skeleton_backend& result, float arg);
582 
583 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
584 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
585 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
586 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned b);
587 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
588 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
589 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long long b);
590 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long b);
591 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, int b);
592 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, short b);
593 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, signed char b);
594 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, char b);
595 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, long double b);
596 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, double b);
597 void eval_modulus(skeleton_backend& result, const skeleton_backend& a, float b);
598 
599 void eval_modulus(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
600 void eval_modulus(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
601 void eval_modulus(skeleton_backend& result, unsigned b, const skeleton_backend& a);
602 void eval_modulus(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
603 void eval_modulus(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
604 void eval_modulus(skeleton_backend& result, long long b, const skeleton_backend& a);
605 void eval_modulus(skeleton_backend& result, long b, const skeleton_backend& a);
606 void eval_modulus(skeleton_backend& result, int b, const skeleton_backend& a);
607 void eval_modulus(skeleton_backend& result, short b, const skeleton_backend& a);
608 void eval_modulus(skeleton_backend& result, signed char b, const skeleton_backend& a);
609 void eval_modulus(skeleton_backend& result, char b, const skeleton_backend& a);
610 void eval_modulus(skeleton_backend& result, long double b, const skeleton_backend& a);
611 void eval_modulus(skeleton_backend& result, double b, const skeleton_backend& a);
612 void eval_modulus(skeleton_backend& result, float b, const skeleton_backend& a);
613 #endif
614 //
615 // bitwise AND:
616 //
617 #if 0
618 void eval_bitwise_and(skeleton_backend& result, unsigned long long arg);
619 void eval_bitwise_and(skeleton_backend& result, unsigned long arg);
620 void eval_bitwise_and(skeleton_backend& result, unsigned arg);
621 void eval_bitwise_and(skeleton_backend& result, unsigned short arg);
622 void eval_bitwise_and(skeleton_backend& result, unsigned char arg);
623 void eval_bitwise_and(skeleton_backend& result, char arg);
624 void eval_bitwise_and(skeleton_backend& result, long long arg);
625 void eval_bitwise_and(skeleton_backend& result, long arg);
626 void eval_bitwise_and(skeleton_backend& result, int arg);
627 void eval_bitwise_and(skeleton_backend& result, short arg);
628 void eval_bitwise_and(skeleton_backend& result, signed char arg);
629 void eval_bitwise_and(skeleton_backend& result, long double arg);
630 void eval_bitwise_and(skeleton_backend& result, double arg);
631 void eval_bitwise_and(skeleton_backend& result, float arg);
632 
633 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
634 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
635 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
636 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned b);
637 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
638 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
639 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long long b);
640 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long b);
641 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, int b);
642 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, short b);
643 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, signed char b);
644 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, char b);
645 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, long double b);
646 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, double b);
647 void eval_bitwise_and(skeleton_backend& result, const skeleton_backend& a, float b);
648 
649 void eval_bitwise_and(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
650 void eval_bitwise_and(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
651 void eval_bitwise_and(skeleton_backend& result, unsigned b, const skeleton_backend& a);
652 void eval_bitwise_and(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
653 void eval_bitwise_and(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
654 void eval_bitwise_and(skeleton_backend& result, long long b, const skeleton_backend& a);
655 void eval_bitwise_and(skeleton_backend& result, long b, const skeleton_backend& a);
656 void eval_bitwise_and(skeleton_backend& result, int b, const skeleton_backend& a);
657 void eval_bitwise_and(skeleton_backend& result, short b, const skeleton_backend& a);
658 void eval_bitwise_and(skeleton_backend& result, signed char b, const skeleton_backend& a);
659 void eval_bitwise_and(skeleton_backend& result, char b, const skeleton_backend& a);
660 void eval_bitwise_and(skeleton_backend& result, long double b, const skeleton_backend& a);
661 void eval_bitwise_and(skeleton_backend& result, double b, const skeleton_backend& a);
662 void eval_bitwise_and(skeleton_backend& result, float b, const skeleton_backend& a);
663 #endif
664 //
665 // bitwise OR:
666 //
667 #if 0
668 void eval_bitwise_or(skeleton_backend& result, unsigned long long arg);
669 void eval_bitwise_or(skeleton_backend& result, unsigned long arg);
670 void eval_bitwise_or(skeleton_backend& result, unsigned arg);
671 void eval_bitwise_or(skeleton_backend& result, unsigned short arg);
672 void eval_bitwise_or(skeleton_backend& result, unsigned char arg);
673 void eval_bitwise_or(skeleton_backend& result, char arg);
674 void eval_bitwise_or(skeleton_backend& result, long long arg);
675 void eval_bitwise_or(skeleton_backend& result, long arg);
676 void eval_bitwise_or(skeleton_backend& result, int arg);
677 void eval_bitwise_or(skeleton_backend& result, short arg);
678 void eval_bitwise_or(skeleton_backend& result, signed char arg);
679 void eval_bitwise_or(skeleton_backend& result, long double arg);
680 void eval_bitwise_or(skeleton_backend& result, double arg);
681 void eval_bitwise_or(skeleton_backend& result, float arg);
682 
683 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
684 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
685 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
686 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned b);
687 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
688 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
689 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long long b);
690 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long b);
691 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, int b);
692 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, short b);
693 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, signed char b);
694 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, char b);
695 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, long double b);
696 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, double b);
697 void eval_bitwise_or(skeleton_backend& result, const skeleton_backend& a, float b);
698 
699 void eval_bitwise_or(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
700 void eval_bitwise_or(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
701 void eval_bitwise_or(skeleton_backend& result, unsigned b, const skeleton_backend& a);
702 void eval_bitwise_or(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
703 void eval_bitwise_or(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
704 void eval_bitwise_or(skeleton_backend& result, long long b, const skeleton_backend& a);
705 void eval_bitwise_or(skeleton_backend& result, long b, const skeleton_backend& a);
706 void eval_bitwise_or(skeleton_backend& result, int b, const skeleton_backend& a);
707 void eval_bitwise_or(skeleton_backend& result, short b, const skeleton_backend& a);
708 void eval_bitwise_or(skeleton_backend& result, signed char b, const skeleton_backend& a);
709 void eval_bitwise_or(skeleton_backend& result, char b, const skeleton_backend& a);
710 void eval_bitwise_or(skeleton_backend& result, long double b, const skeleton_backend& a);
711 void eval_bitwise_or(skeleton_backend& result, double b, const skeleton_backend& a);
712 void eval_bitwise_or(skeleton_backend& result, float b, const skeleton_backend& a);
713 #endif
714 //
715 // bitwise XOR:
716 //
717 #if 0
718 void eval_bitwise_xor(skeleton_backend& result, unsigned long long arg);
719 void eval_bitwise_xor(skeleton_backend& result, unsigned long arg);
720 void eval_bitwise_xor(skeleton_backend& result, unsigned arg);
721 void eval_bitwise_xor(skeleton_backend& result, unsigned short arg);
722 void eval_bitwise_xor(skeleton_backend& result, unsigned char arg);
723 void eval_bitwise_xor(skeleton_backend& result, char arg);
724 void eval_bitwise_xor(skeleton_backend& result, long long arg);
725 void eval_bitwise_xor(skeleton_backend& result, long arg);
726 void eval_bitwise_xor(skeleton_backend& result, int arg);
727 void eval_bitwise_xor(skeleton_backend& result, short arg);
728 void eval_bitwise_xor(skeleton_backend& result, signed char arg);
729 void eval_bitwise_xor(skeleton_backend& result, long double arg);
730 void eval_bitwise_xor(skeleton_backend& result, double arg);
731 void eval_bitwise_xor(skeleton_backend& result, float arg);
732 
733 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
734 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
735 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
736 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned b);
737 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
738 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
739 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long long b);
740 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long b);
741 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, int b);
742 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, short b);
743 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, signed char b);
744 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, char b);
745 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, long double b);
746 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, double b);
747 void eval_bitwise_xor(skeleton_backend& result, const skeleton_backend& a, float b);
748 
749 void eval_bitwise_xor(skeleton_backend& result, unsigned long long b, const skeleton_backend& a);
750 void eval_bitwise_xor(skeleton_backend& result, unsigned long b, const skeleton_backend& a);
751 void eval_bitwise_xor(skeleton_backend& result, unsigned b, const skeleton_backend& a);
752 void eval_bitwise_xor(skeleton_backend& result, unsigned short b, const skeleton_backend& a);
753 void eval_bitwise_xor(skeleton_backend& result, unsigned char b, const skeleton_backend& a);
754 void eval_bitwise_xor(skeleton_backend& result, long long b, const skeleton_backend& a);
755 void eval_bitwise_xor(skeleton_backend& result, long b, const skeleton_backend& a);
756 void eval_bitwise_xor(skeleton_backend& result, int b, const skeleton_backend& a);
757 void eval_bitwise_xor(skeleton_backend& result, short b, const skeleton_backend& a);
758 void eval_bitwise_xor(skeleton_backend& result, signed char b, const skeleton_backend& a);
759 void eval_bitwise_xor(skeleton_backend& result, char b, const skeleton_backend& a);
760 void eval_bitwise_xor(skeleton_backend& result, long double b, const skeleton_backend& a);
761 void eval_bitwise_xor(skeleton_backend& result, double b, const skeleton_backend& a);
762 void eval_bitwise_xor(skeleton_backend& result, float b, const skeleton_backend& a);
763 #endif
764 //
765 // left and right shift:
766 //
767 //void eval_left_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift);
768 //void eval_right_shift(skeleton_backend& result, const skeleton_backend& arg, std::size_t shift);
769 //
770 // Quotient and remainder:
771 //
772 // void eval_qr(const skeleton_backend& numerator, const skeleton_backend& denominator, skeleton_backend& quotient, skeleteon_backend& remainder);
773 //
774 // Misc integer ops:
775 //
776 // unsigned long long eval_integer_modulus(const skeleton_backend& arg, unsigned long long modulus);
777 // unsigned long eval_integer_modulus(const skeleton_backend& arg, unsigned long modulus);
778 // unsigned eval_integer_modulus(const skeleton_backend& arg, unsigned modulus);
779 // unsigned short eval_integer_modulus(const skeleton_backend& arg, unsigned short modulus);
780 // unsigned char eval_integer_modulus(const skeleton_backend& arg, unsigned char modulus);
781 //
782 // std::size_t  eval_lsb(const skeleton_backend& arg);
783 // std::size_t  eval_msb(const skeleton_backend& arg);
784 // bool  eval_bit_test(const skeleton_backend& arg, std::size_t bit);
785 // void  eval_bit_set(const skeleton_backend& arg, std::size_t bit);
786 // void  eval_bit_unset(const skeleton_backend& arg, std::size_t bit);
787 // void  eval_bit_flip(const skeleton_backend& arg, std::size_t bit);
788 //
789 // GCD/LCD:
790 //
791 #if 0
792 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
793 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
794 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
795 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned b);
796 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
797 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
798 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, long long b);
799 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, long b);
800 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, int b);
801 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, short b);
802 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, signed char b);
803 void eval_gcd(skeleton_backend& result, const skeleton_backend& a, char b);
804 void eval_gcd(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
805 void eval_gcd(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
806 void eval_gcd(skeleton_backend& result, unsigned a, const skeleton_backend& b);
807 void eval_gcd(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
808 void eval_gcd(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
809 void eval_gcd(skeleton_backend& result, long long a, const skeleton_backend& b);
810 void eval_gcd(skeleton_backend& result, long a, const skeleton_backend& b);
811 void eval_gcd(skeleton_backend& result, int a, const skeleton_backend& b);
812 void eval_gcd(skeleton_backend& result, short a, const skeleton_backend& b);
813 void eval_gcd(skeleton_backend& result, signed char a, const skeleton_backend& b);
814 void eval_gcd(skeleton_backend& result, char a, const skeleton_backend& b);
815 
816 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
817 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
818 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
819 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned b);
820 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
821 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
822 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, long long b);
823 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, long b);
824 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, int b);
825 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, short b);
826 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, signed char b);
827 void eval_lcm(skeleton_backend& result, const skeleton_backend& a, char b);
828 void eval_lcm(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
829 void eval_lcm(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
830 void eval_lcm(skeleton_backend& result, unsigned a, const skeleton_backend& b);
831 void eval_lcm(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
832 void eval_lcm(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
833 void eval_lcm(skeleton_backend& result, long long a, const skeleton_backend& b);
834 void eval_lcm(skeleton_backend& result, long a, const skeleton_backend& b);
835 void eval_lcm(skeleton_backend& result, int a, const skeleton_backend& b);
836 void eval_lcm(skeleton_backend& result, short a, const skeleton_backend& b);
837 void eval_lcm(skeleton_backend& result, signed char a, const skeleton_backend& b);
838 void eval_lcm(skeleton_backend& result, char a, const skeleton_backend& b);
839 #endif
840 //
841 // Modular exponentiation:
842 //
843 #if 0
844 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, const skeleton_backend& c);  // a^b % c
845 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long long c);
846 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned long c);
847 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned c);
848 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned short c);
849 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, unsigned char c);
850 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long long c);
851 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, long c);
852 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int c);
853 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, short c);
854 void eval_powm(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, signed char c);
855 
856 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, const skeleton_backend& c);
857 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, const skeleton_backend& c);
858 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, const skeleton_backend& c);
859 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, const skeleton_backend& c);
860 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, const skeleton_backend& c);
861 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, const skeleton_backend& c);
862 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, const skeleton_backend& c);
863 void eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, const skeleton_backend& c);
864 void eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, const skeleton_backend& c);
865 void eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, const skeleton_backend& c);
866 
867 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, unsigned long long c);
868 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned long b, unsigned long c);
869 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned b, unsigned c);
870 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned short b, unsigned short c);
871 void eval_powm(skeleton_backend& result, const skeleton_backend& a, unsigned char b, unsigned char c);
872 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long long b, long long c);
873 void eval_powm(skeleton_backend& result, const skeleton_backend& a, long b, long c);
874 void eval_powm(skeleton_backend& result, const skeleton_backend& a, int b, int c);
875 void eval_powm(skeleton_backend& result, const skeleton_backend& a, short b, short c);
876 void eval_powm(skeleton_backend& result, const skeleton_backend& a, signed char b, signed char c);
877 #endif
878 //
879 // Integer sqrt:
880 //
881 // void eval_integer_sqrt(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend& remainder);
882 
883 /*********************************************************************************************
884 
885      FLOATING POINT FUNCTIONS
886 
887 ***********************************************************************************************/
888 
889 #if 0
890 
891 int eval_fpclassify(const skeleton_backend& arg);
892 void eval_trunc(skeleton_backend& result, const skeleton_backend& arg);
893 void eval_round(skeleton_backend& result, const skeleton_backend& arg);
894 void eval_exp(skeleton_backend& result, const skeleton_backend& arg);
895 void eval_exp2(skeleton_backend& result, const skeleton_backend& arg);
896 void eval_log(skeleton_backend& result, const skeleton_backend& arg);
897 void eval_log10(skeleton_backend& result, const skeleton_backend& arg);
898 void eval_sin(skeleton_backend& result, const skeleton_backend& arg);
899 void eval_cos(skeleton_backend& result, const skeleton_backend& arg);
900 void eval_tan(skeleton_backend& result, const skeleton_backend& arg);
901 void eval_asin(skeleton_backend& result, const skeleton_backend& arg);
902 void eval_acos(skeleton_backend& result, const skeleton_backend& arg);
903 void eval_atan(skeleton_backend& result, const skeleton_backend& arg);
904 void eval_sinh(skeleton_backend& result, const skeleton_backend& arg);
905 void eval_cosh(skeleton_backend& result, const skeleton_backend& arg);
906 void eval_tanh(skeleton_backend& result, const skeleton_backend& arg);
907 void eval_asinh(skeleton_backend& result, const skeleton_backend& arg);
908 void eval_acosh(skeleton_backend& result, const skeleton_backend& arg);
909 void eval_atanh(skeleton_backend& result, const skeleton_backend& arg);
910 void eval_fmod(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
911 void eval_modf(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
912 void eval_pow(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
913 void eval_atan2(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
914 void eval_scalbn(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e);
915 void eval_scalbln(skeleton_backend& result, const skeleton_backend& arg, skeleton_backend::exponent_type e);
916 skeleton_type::exponent_type eval_ilogb(const skeleton_backend& arg);
917 
918 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b, int* p_n);
919 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long long b, int* p_n);
920 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned long b, int* p_n);
921 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned b, int* p_n);
922 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned short b, int* p_n);
923 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, unsigned char b, int* p_n);
924 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long long b, int* p_n);
925 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long b, int* p_n);
926 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, int b, int* p_n);
927 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, short b, int* p_n);
928 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, signed char b, int* p_n);
929 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, long double b, int* p_n);
930 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, double b, int* p_n);
931 void eval_remquo(skeleton_backend& result, const skeleton_backend& a, float b, int* p_n);
932 void eval_remquo(skeleton_backend& result, unsigned long long a, const skeleton_backend& b, int* p_n);
933 void eval_remquo(skeleton_backend& result, unsigned long a, const skeleton_backend& b, int* p_n);
934 void eval_remquo(skeleton_backend& result, unsigned a, const skeleton_backend& b, int* p_n);
935 void eval_remquo(skeleton_backend& result, unsigned short a, const skeleton_backend& b, int* p_n);
936 void eval_remquo(skeleton_backend& result, unsigned char a, const skeleton_backend& b, int* p_n);
937 void eval_remquo(skeleton_backend& result, long long a, const skeleton_backend& b, int* p_n);
938 void eval_remquo(skeleton_backend& result, long a, const skeleton_backend& b, int* p_n);
939 void eval_remquo(skeleton_backend& result, int a, const skeleton_backend& b, int* p_n);
940 void eval_remquo(skeleton_backend& result, short a, const skeleton_backend& b, int* p_n);
941 void eval_remquo(skeleton_backend& result, signed char a, const skeleton_backend& b, int* p_n);
942 
943 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
944 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
945 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
946 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned b);
947 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
948 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
949 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long long b);
950 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long b);
951 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, int b);
952 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, short b);
953 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, signed char b);
954 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, long double b);
955 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, double b);
956 void eval_remainder(skeleton_backend& result, const skeleton_backend& a, float b);
957 void eval_remainder(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
958 void eval_remainder(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
959 void eval_remainder(skeleton_backend& result, unsigned a, const skeleton_backend& b);
960 void eval_remainder(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
961 void eval_remainder(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
962 void eval_remainder(skeleton_backend& result, long long a, const skeleton_backend& b);
963 void eval_remainder(skeleton_backend& result, long a, const skeleton_backend& b);
964 void eval_remainder(skeleton_backend& result, int a, const skeleton_backend& b);
965 void eval_remainder(skeleton_backend& result, short a, const skeleton_backend& b);
966 void eval_remainder(skeleton_backend& result, signed char a, const skeleton_backend& b);
967 
968 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
969 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
970 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
971 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned b);
972 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
973 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
974 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long long b);
975 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long b);
976 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, int b);
977 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, short b);
978 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, signed char b);
979 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, long double b);
980 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, double b);
981 void eval_fdim(skeleton_backend& result, const skeleton_backend& a, float b);
982 void eval_fdim(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
983 void eval_fdim(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
984 void eval_fdim(skeleton_backend& result, unsigned a, const skeleton_backend& b);
985 void eval_fdim(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
986 void eval_fdim(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
987 void eval_fdim(skeleton_backend& result, long long a, const skeleton_backend& b);
988 void eval_fdim(skeleton_backend& result, long a, const skeleton_backend& b);
989 void eval_fdim(skeleton_backend& result, int a, const skeleton_backend& b);
990 void eval_fdim(skeleton_backend& result, short a, const skeleton_backend& b);
991 void eval_fdim(skeleton_backend& result, signed char a, const skeleton_backend& b);
992 
993 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
994 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
995 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
996 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned b);
997 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
998 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
999 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long long b);
1000 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long b);
1001 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, int b);
1002 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, short b);
1003 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, signed char b);
1004 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, long double b);
1005 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, double b);
1006 void eval_fmax(skeleton_backend& result, const skeleton_backend& a, float b);
1007 void eval_fmax(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
1008 void eval_fmax(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
1009 void eval_fmax(skeleton_backend& result, unsigned a, const skeleton_backend& b);
1010 void eval_fmax(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
1011 void eval_fmax(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
1012 void eval_fmax(skeleton_backend& result, long long a, const skeleton_backend& b);
1013 void eval_fmax(skeleton_backend& result, long a, const skeleton_backend& b);
1014 void eval_fmax(skeleton_backend& result, int a, const skeleton_backend& b);
1015 void eval_fmax(skeleton_backend& result, short a, const skeleton_backend& b);
1016 void eval_fmax(skeleton_backend& result, signed char a, const skeleton_backend& b);
1017 
1018 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
1019 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
1020 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
1021 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned b);
1022 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
1023 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
1024 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long long b);
1025 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long b);
1026 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, int b);
1027 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, short b);
1028 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, signed char b);
1029 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, long double b);
1030 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, double b);
1031 void eval_fmin(skeleton_backend& result, const skeleton_backend& a, float b);
1032 void eval_fmin(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
1033 void eval_fmin(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
1034 void eval_fmin(skeleton_backend& result, unsigned a, const skeleton_backend& b);
1035 void eval_fmin(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
1036 void eval_fmin(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
1037 void eval_fmin(skeleton_backend& result, long long a, const skeleton_backend& b);
1038 void eval_fmin(skeleton_backend& result, long a, const skeleton_backend& b);
1039 void eval_fmin(skeleton_backend& result, int a, const skeleton_backend& b);
1040 void eval_fmin(skeleton_backend& result, short a, const skeleton_backend& b);
1041 void eval_fmin(skeleton_backend& result, signed char a, const skeleton_backend& b);
1042 
1043 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, const skeleton_backend& b);
1044 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long long b);
1045 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned long b);
1046 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned b);
1047 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned short b);
1048 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, unsigned char b);
1049 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long long b);
1050 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long b);
1051 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, int b);
1052 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, short b);
1053 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, signed char b);
1054 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, long double b);
1055 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, double b);
1056 void eval_hypot(skeleton_backend& result, const skeleton_backend& a, float b);
1057 void eval_hypot(skeleton_backend& result, unsigned long long a, const skeleton_backend& b);
1058 void eval_hypot(skeleton_backend& result, unsigned long a, const skeleton_backend& b);
1059 void eval_hypot(skeleton_backend& result, unsigned a, const skeleton_backend& b);
1060 void eval_hypot(skeleton_backend& result, unsigned short a, const skeleton_backend& b);
1061 void eval_hypot(skeleton_backend& result, unsigned char a, const skeleton_backend& b);
1062 void eval_hypot(skeleton_backend& result, long long a, const skeleton_backend& b);
1063 void eval_hypot(skeleton_backend& result, long a, const skeleton_backend& b);
1064 void eval_hypot(skeleton_backend& result, int a, const skeleton_backend& b);
1065 void eval_hypot(skeleton_backend& result, short a, const skeleton_backend& b);
1066 void eval_hypot(skeleton_backend& result, signed char a, const skeleton_backend& b);
1067 
1068 void eval_logb(skeleton_backend& result, const skeleton_backend& arg);
1069 void eval_nearbtint(skeleton_backend& result, const skeleton_backend& arg);
1070 void eval_rint(skeleton_backend& result, const skeleton_backend& arg);
1071 void eval_log2(skeleton_backend& result, const skeleton_backend& arg);
1072 #endif
1073 
1074 
1075 } // namespace backends
1076 
1077 //
1078 // Import the backend into this namespace:
1079 //
1080 using boost::multiprecision::backends::skeleton_backend;
1081 //
1082 // Typedef whatever number's make use of this backend:
1083 //
1084 typedef number<skeleton_backend, et_off> skeleton_number;
1085 //
1086 // Define a category for this number type, one of:
1087 //
1088 //    number_kind_integer
1089 //    number_kind_floating_point
1090 //    number_kind_rational
1091 //    number_kind_fixed_point
1092 //    number_kind_complex
1093 //
1094 template<>
1095 struct number_category<skeleton_backend > : public mpl::int_<number_kind_floating_point>
1096 {};
1097 
1098 //
1099 // These 2 traits classes are required for complex types only:
1100 //
1101 /*
1102 template <expression_template_option ExpressionTemplates>
1103 struct component_type<number<skeleton_backend, ExpressionTemplates> >
1104 {
1105    typedef number<skeleton_real_type, ExpressionTemplates> type;
1106 };
1107 
1108 template <expression_template_option ExpressionTemplates>
1109 struct complex_result_from_scalar<number<skeleton_real_type, ExpressionTemplates> >
1110 {
1111    typedef number<skeleton_backend, ExpressionTemplates> type;
1112 };
1113 */
1114 
1115 /**************************************************************
1116 
1117 OVERLOADABLE FUNCTIONS - FLOATING POINT TYPES ONLY
1118 
1119 ****************************************************************/
1120 
1121 #if 0
1122 
1123 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1124 int sign(const number<skeleton_backend, ExpressionTemplates>& arg);
1125 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1126 int signbit(const number<skeleton_backend, ExpressionTemplates>& arg);
1127 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1128 number<skeleton_backend, ExpressionTemplates> changesign(const number<skeleton_backend, ExpressionTemplates>& arg);
1129 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1130 number<skeleton_backend, ExpressionTemplates> copysign(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);
1131 
1132 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1133 number<skeleton_backend, ExpressionTemplates> cbrt(const number<skeleton_backend, ExpressionTemplates>& arg);
1134 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1135 number<skeleton_backend, ExpressionTemplates> erf(const number<skeleton_backend, ExpressionTemplates>& arg);
1136 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1137 number<skeleton_backend, ExpressionTemplates> erfc(const number<skeleton_backend, ExpressionTemplates>& arg);
1138 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1139 number<skeleton_backend, ExpressionTemplates> expm1(const number<skeleton_backend, ExpressionTemplates>& arg);
1140 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1141 number<skeleton_backend, ExpressionTemplates> log1p(const number<skeleton_backend, ExpressionTemplates>& arg);
1142 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1143 number<skeleton_backend, ExpressionTemplates> tgamma(const number<skeleton_backend, ExpressionTemplates>& arg);
1144 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1145 number<skeleton_backend, ExpressionTemplates> lgamma(const number<skeleton_backend, ExpressionTemplates>& arg);
1146 
1147 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1148 long lrint(const number<skeleton_backend, ExpressionTemplates>& arg);
1149 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1150 long long llrint(const number<skeleton_backend, ExpressionTemplates>& arg);
1151 
1152 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1153 number<skeleton_backend, ExpressionTemplates> nextafter(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);
1154 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1155 number<skeleton_backend, ExpressionTemplates> nexttoward(const number<skeleton_backend, ExpressionTemplates>& a, const number<skeleton_backend, ExpressionTemplates>& b);
1156 
1157 #endif
1158 
1159 }} // namespace boost::multiprecision
1160 
1161 /**********************************************************************************
1162 
1163 FLOATING POINT ONLY
1164 Nice to have stuff for better integration with Boost.Math.
1165 
1166 ***********************************************************************************/
1167 
1168 namespace boost {
1169 namespace math {
1170 namespace tools {
1171 
1172 #if 0
1173 
1174 template <>
1175 int digits<boost::multiprecision::number<boost::multiprecision::skeleton_number> >();
1176 
1177 template <>
1178 boost::multiprecision::mpfr_float max_value<boost::multiprecision::skeleton_number>();
1179 
1180 template <>
1181 boost::multiprecision::mpfr_float min_value<boost::multiprecision::skeleton_number>();
1182 
1183 #endif
1184 
1185 } // namespace tools
1186 
1187 namespace constants {
1188 namespace detail {
1189 
1190 #if 0
1191 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1192 struct constant_pi<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >
1193 {
1194    typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> result_type;
1195    //
1196    // Fixed N-digit precision, return reference to internal/cached object:
1197    //
1198    template <int N>
1199    static inline const result_type& get(const boost::integral_constant<int, N>&);
1200    //
1201    // Variable precision, returns fresh result each time (unless precision is unchanged from last call):
1202    //
1203    static inline const result_type  get(const boost::integral_constant<int, 0>&);
1204 };
1205 //
1206 // Plus any other constants supported natively by this type....
1207 //
1208 #endif
1209 
1210 } // namespace detail
1211 } // namespace constants
1212 
1213 }} // namespace boost::math
1214 
1215 
1216 namespace std {
1217 
1218 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1219 class numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >
1220 {
1221    typedef boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> number_type;
1222 
1223  public:
1224    BOOST_STATIC_CONSTEXPR bool is_specialized = true;
1225    static number_type(min)();
1226    static number_type(max)();
1227    static number_type lowest();
1228    BOOST_STATIC_CONSTEXPR int                digits       = 0;
1229    BOOST_STATIC_CONSTEXPR int                digits10     = 0;
1230    BOOST_STATIC_CONSTEXPR int                max_digits10 = 0;
1231    BOOST_STATIC_CONSTEXPR bool               is_signed    = false;
1232    BOOST_STATIC_CONSTEXPR bool               is_integer   = false;
1233    BOOST_STATIC_CONSTEXPR bool               is_exact     = false;
1234    BOOST_STATIC_CONSTEXPR int                radix        = 2;
1235    static number_type                        epsilon();
1236    static number_type                        round_error();
1237    BOOST_STATIC_CONSTEXPR int                min_exponent      = 0;
1238    BOOST_STATIC_CONSTEXPR int                min_exponent10    = 0;
1239    BOOST_STATIC_CONSTEXPR int                max_exponent      = 0;
1240    BOOST_STATIC_CONSTEXPR int                max_exponent10    = 0;
1241    BOOST_STATIC_CONSTEXPR bool               has_infinity      = false;
1242    BOOST_STATIC_CONSTEXPR bool               has_quiet_NaN     = false;
1243    BOOST_STATIC_CONSTEXPR bool               has_signaling_NaN = false;
1244    BOOST_STATIC_CONSTEXPR float_denorm_style has_denorm        = denorm_absent;
1245    BOOST_STATIC_CONSTEXPR bool               has_denorm_loss   = false;
1246    static number_type                        infinity();
1247    static number_type                        quiet_NaN();
1248    static number_type                        signaling_NaN();
1249    static number_type                        denorm_min();
1250    BOOST_STATIC_CONSTEXPR bool               is_iec559       = false;
1251    BOOST_STATIC_CONSTEXPR bool               is_bounded      = false;
1252    BOOST_STATIC_CONSTEXPR bool               is_modulo       = false;
1253    BOOST_STATIC_CONSTEXPR bool               traps           = false;
1254    BOOST_STATIC_CONSTEXPR bool               tinyness_before = false;
1255    BOOST_STATIC_CONSTEXPR float_round_style  round_style     = round_toward_zero;
1256 };
1257 
1258 #ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
1259 
1260 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1261 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits;
1262 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1263 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::digits10;
1264 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1265 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_digits10;
1266 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1267 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_signed;
1268 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1269 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_integer;
1270 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1271 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_exact;
1272 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1273 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::radix;
1274 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1275 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent;
1276 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1277 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::min_exponent10;
1278 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1279 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent;
1280 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1281 BOOST_CONSTEXPR_OR_CONST int numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::max_exponent10;
1282 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1283 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_infinity;
1284 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1285 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_quiet_NaN;
1286 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1287 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_signaling_NaN;
1288 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1289 BOOST_CONSTEXPR_OR_CONST float_denorm_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm;
1290 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1291 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::has_denorm_loss;
1292 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1293 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_iec559;
1294 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1295 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_bounded;
1296 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1297 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::is_modulo;
1298 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1299 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::traps;
1300 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1301 BOOST_CONSTEXPR_OR_CONST bool numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::tinyness_before;
1302 template <boost::multiprecision::expression_template_option ExpressionTemplates>
1303 BOOST_CONSTEXPR_OR_CONST float_round_style numeric_limits<boost::multiprecision::number<boost::multiprecision::skeleton_backend, ExpressionTemplates> >::round_style;
1304 
1305 #endif
1306 
1307 } // namespace std
1308 
1309 #endif
1310