Initial git import
[sxemacs] / src / ent / ent-quatern.h
1 /*
2   ent-quatern.h -- Numeric types for SXEmacs
3   Copyright (C) 2005, 2006 Sebastian Freundt
4
5   Author:  Sebastian Freundt
6
7 This file is part of SXEmacs
8
9 SXEmacs is free software: you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
11 the Free Software Foundation, either version 3 of the License, or
12 (at your option) any later version.
13
14 SXEmacs is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
20 along with this program.  If not, see <http://www.gnu.org/licenses/>. */
21
22
23 #ifndef INCLUDED_ent_quatern_h_
24 #define INCLUDED_ent_quatern_h_
25
26 #ifdef UNO
27 /* Uno complains about several inline functions that include conditions with
28    assignments and side effects if we don't do this */
29 #undef __GNUC__
30 #endif
31
32 #if defined HAVE_GMP
33 # include "ent-gmp.h"
34 #elif defined HAVE_BSDMP
35 # include "ent-mp.h"
36 #else
37 # error "Bollocks, in your dreams, twit!"
38 #endif
39
40 extern Lisp_Object Qquatern;
41
42 struct quatern
43 {
44         bigz z;
45         bigz i;
46         bigz j;
47         bigz k;
48 };
49 typedef struct quatern quatern[1];
50
51 extern quatern ent_scratch_quatern;
52
53 \f
54 /******************************** Quaterns ********************************/
55 struct Lisp_Quatern
56 {
57         struct lrecord_header lheader;
58         quatern data;
59 };
60 typedef struct Lisp_Quatern Lisp_Quatern;
61
62 DECLARE_LRECORD(quatern, Lisp_Quatern);
63 #define XQUATERN(x) XRECORD(x, quatern, Lisp_Quatern)
64 #define wrap_quatern(p) wrap_object(p)
65 #define QUATERNP(x) RECORDP(x, quatern)
66 #define CHECK_QUATERN(x) CHECK_RECORD(x, quatern)
67 #define CONCHECK_QUATERN(x) CONCHECK_RECORD(x, quatern)
68
69 #define quatern_data(f) ((f)->data)
70 #define XQUATERN_DATA(x) quatern_data(XQUATERN(x))
71
72 #define XQUATERN_Z(x) quatern_z(XQUATERN_DATA(x))
73 #define XQUATERN_I(x) quatern_i(XQUATERN_DATA(x))
74 #define XQUATERN_J(x) quatern_j(XQUATERN_DATA(x))
75 #define XQUATERN_K(x) quatern_k(XQUATERN_DATA(x))
76
77 #define QUATERN_ARITH_RETURN(f,op) do                                   \
78 {                                                                       \
79         Lisp_Object retval = make_quatern(0L, 0L);                      \
80         quatern_##op(XQUATERN_DATA(retval), XQUATERN_DATA(f));          \
81         return retval;                                                  \
82 } while (0)
83
84 #define QUATERN_ARITH_RETURN1(f,op,arg) do                              \
85 {                                                                       \
86         Lisp_Object retval = make_quatern(0L, 0L);                      \
87         quatern_##op(XQUATERN_DATA(retval), XQUATERN_DATA(f), arg);     \
88         return retval;                                                  \
89 } while (0)
90
91 extern Lisp_Object make_quatern(long, long, long, long);
92 extern Lisp_Object make_quatern_bz(bigz, bigz, bigz, bigz);
93 extern Lisp_Object make_quatern_qu(quatern);
94
95 \f
96 /***** quatern: basic functions *****/
97 extern void quatern_init(quatern);
98 extern void quatern_fini(quatern);
99 extern unsigned long quatern_hashcode(quatern);
100
101 /***** Quatern: conversions *****/
102 extern Bufbyte *quatern_to_string(quatern, int);
103
104 /***** Quatern: converting assignments *****/
105 extern void quatern_set(quatern, quatern);
106 extern void quatern_set_long(quatern, long);
107 extern void quatern_set_ulong(quatern, unsigned long);
108 extern void quatern_set_bigz(quatern, bigz);
109 extern void quatern_set_long_long_long_long(quatern, long, long, long, long);
110 extern void quatern_set_ulong_ulong_ulong_ulong
111 (quatern, unsigned long, unsigned long, unsigned long, unsigned long);
112 extern void quatern_set_bigz_bigz_bigz_bigz(quatern, bigz, bigz, bigz, bigz);
113
114 #define quatern_z(q)                  ((q)->z)
115 #define quatern_i(q)                  ((q)->i)
116 #define quatern_j(q)                  ((q)->j)
117 #define quatern_k(q)                  ((q)->k)
118
119 /***** Quatern: comparisons *****/
120 extern int quatern_eql(quatern, quatern);
121 #define quatern_cmp(f1,f2)             (quatern_eql(f1,f2) ? 0 : 1)
122
123 /***** Quatern: arithmetic *****/
124 extern void quatern_neg(quatern, quatern);
125 #ifdef HAVE_MPFR
126 extern void quatern_abs(bigfr, quatern);
127 #endif
128 extern void quatern_norm(bigz, quatern);
129 extern void quatern_conj(quatern, quatern);
130 extern void quatern_add(quatern, quatern, quatern);
131 extern void quatern_sub(quatern, quatern, quatern);
132 extern void quatern_mul(quatern, quatern, quatern);
133 extern void quatern_div(quatern, quatern, quatern);
134 extern void quatern_mod(quatern, quatern, quatern);
135 extern void quatern_pow(quatern, quatern, unsigned long);
136
137 extern Lisp_Object read_quatern_string(char *);
138 extern int isquatern_string(const char *);
139
140 extern void init_optables_QUATERN_T(void);
141 extern void init_ent_quatern(void);
142 extern void syms_of_ent_quatern(void);
143 extern void vars_of_ent_quatern(void);
144
145 #endif /* INCLUDED_ent_quatern_h_ */