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