]> www.ginac.de Git - cln.git/blob - src/base/ring/cl_no_ring.cc
Initial revision
[cln.git] / src / base / ring / cl_no_ring.cc
1 // Dummy ring.
2
3 // General includes.
4 #include "cl_sysdep.h"
5
6 CL_PROVIDE(cl_no_ring)
7
8 // Specification.
9 #include "cl_ring.h"
10
11
12 // Implementation.
13
14 #include "cl_io.h"
15 #include "cl_abort.h"
16
17 nonreturning_function(static, uninitialized_ring, (void));
18 static void uninitialized_ring ()
19 {
20         fprint(cl_stderr, "Uninitialized ring operation called\n");
21         cl_abort();
22 }
23
24 nonreturning_function(static, uninitialized_error, (const _cl_ring_element&));
25 static void uninitialized_error (const _cl_ring_element& obj)
26 {
27         fprint(cl_stderr, "Uninitialized ring element @0x");
28         fprinthexadecimal(cl_stderr, (unsigned long)(void*)&obj);
29         fprint(cl_stderr, ": 0x");
30         fprinthexadecimal(cl_stderr, (unsigned long)obj.rep.word);
31         fprint(cl_stderr, "\n");
32         cl_abort();
33 }
34
35 #if (defined(__sparc__) && !defined(__GNUC__))
36   // avoid Sun C++ 4.1 compiler bug
37   #define RETDUMMY  return *(_cl_ring_element*)R
38 #else
39   #define RETDUMMY  return *(_cl_ring_element*)0
40 #endif
41
42 static const _cl_ring_element dummy_op0 (cl_heap_ring* R)
43 {
44         unused R;
45         uninitialized_ring(); RETDUMMY;
46 }
47
48 static const _cl_ring_element dummy_op1 (cl_heap_ring* R, const _cl_ring_element& x)
49 {
50         unused R;
51         uninitialized_error(x); RETDUMMY;
52 }
53
54 static const _cl_ring_element dummy_op2 (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y)
55 {
56         unused R;
57         uninitialized_error(x); uninitialized_error(y); RETDUMMY;
58 }
59
60 static void dummy_fprint (cl_heap_ring* R, cl_ostream stream, const _cl_ring_element& x)
61 {
62         unused R;
63         unused stream;
64         uninitialized_error(x);
65 }
66 static cl_boolean dummy_equal (cl_heap_ring* R, const _cl_ring_element& x, const _cl_ring_element& y)
67 {
68         unused R;
69         uninitialized_error(x); uninitialized_error(y); return cl_false;
70 }
71
72 #define dummy_zero dummy_op0
73 static cl_boolean dummy_zerop (cl_heap_ring* R, const _cl_ring_element& x)
74 {
75         unused R;
76         uninitialized_error(x); return cl_false;
77 }
78 #define dummy_plus dummy_op2
79 #define dummy_minus dummy_op2
80 #define dummy_uminus dummy_op1
81
82 #define dummy_one dummy_op0
83 static const _cl_ring_element dummy_canonhom (cl_heap_ring* R, const cl_I& x)
84 {
85         unused R;
86         (void)&x; // unused x;
87         uninitialized_ring(); RETDUMMY;
88 }
89 #define dummy_mul dummy_op2
90 #define dummy_square dummy_op1
91 static const _cl_ring_element dummy_expt_pos (cl_heap_ring* R, const _cl_ring_element& x, const cl_I& y)
92 {
93         unused R;
94         (void)&y; // unused y;
95         uninitialized_error(x); RETDUMMY;
96 }
97
98 static cl_ring_setops dummy_setops = {
99         dummy_fprint,
100         dummy_equal
101 };
102 static cl_ring_addops dummy_addops = {
103         dummy_zero,
104         dummy_zerop,
105         dummy_plus,
106         dummy_minus,
107         dummy_uminus
108 };
109 static cl_ring_mulops dummy_mulops = {
110         dummy_one,
111         dummy_canonhom,
112         dummy_mul,
113         dummy_square,
114         dummy_expt_pos
115 };
116
117 class cl_heap_no_ring : public cl_heap_ring {
118         SUBCLASS_cl_heap_ring()
119 public:
120         // Constructor.
121         cl_heap_no_ring ()
122                 : cl_heap_ring (&dummy_setops,&dummy_addops,&dummy_mulops)
123                 { type = &cl_class_no_ring; }
124         // Destructor.
125         ~cl_heap_no_ring () {}
126 };
127
128 static void cl_no_ring_destructor (cl_heap* pointer)
129 {
130         (*(cl_heap_no_ring*)pointer).~cl_heap_no_ring();
131 }
132
133 static void cl_no_ring_dprint (cl_heap* pointer)
134 {
135         unused pointer;
136         fprint(cl_debugout, "(cl_ring) cl_no_ring");
137 }
138
139 cl_class cl_class_no_ring = {
140         cl_no_ring_destructor,
141         0,
142         cl_no_ring_dprint
143 };
144
145 const cl_ring cl_no_ring = cl_ring (new cl_heap_no_ring());
146
147 CL_PROVIDE_END(cl_no_ring)