1 /*
2     Copyright (C) 2020 Daniel Schultz
3 
4     This file is part of FLINT.
5 
6     FLINT is free software: you can redistribute it and/or modify it under
7     the terms of the GNU Lesser General Public License (LGPL) as published
8     by the Free Software Foundation; either version 2.1 of the License, or
9     (at your option) any later version.  See <https://www.gnu.org/licenses/>.
10 */
11 
12 #include "fmpz_mod_mpoly_factor.h"
13 
14 
fmpz_mod_poly_stack_init(fmpz_mod_poly_stack_t S)15 void fmpz_mod_poly_stack_init(fmpz_mod_poly_stack_t S)
16 {
17     S->alloc = 0;
18     S->array = NULL;
19     S->top = 0;
20 }
21 
fmpz_mod_poly_stack_clear(fmpz_mod_poly_stack_t S)22 void fmpz_mod_poly_stack_clear(fmpz_mod_poly_stack_t S)
23 {
24     slong i;
25 
26     FLINT_ASSERT(S->top == 0);
27 
28     for (i = 0; i < S->alloc; i++)
29     {
30         fmpz_mod_poly_clear(S->array[i], NULL);
31         flint_free(S->array[i]);
32     }
33 
34     flint_free(S->array);
35 }
36 
37 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_poly_stack_fit_request(fmpz_mod_poly_stack_t S,slong k)38 fmpz_mod_poly_struct ** fmpz_mod_poly_stack_fit_request(
39     fmpz_mod_poly_stack_t S,
40     slong k)
41 {
42     slong newalloc, i;
43 
44     FLINT_ASSERT(S->alloc >= S->top);
45 
46     if (S->top + k > S->alloc)
47     {
48         newalloc = FLINT_MAX(1, S->top + k);
49 
50         S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_poly_struct *);
51 
52         for (i = S->alloc; i < newalloc; i++)
53         {
54             S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_poly_struct);
55             fmpz_mod_poly_init(S->array[i], NULL);
56         }
57         S->alloc = newalloc;
58     }
59 
60     return S->array + S->top;
61 }
62 
63 
64 
fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S)65 void fmpz_mod_bpoly_stack_init(fmpz_mod_bpoly_stack_t S)
66 {
67     S->alloc = 0;
68     S->array = NULL;
69     S->top = 0;
70 }
71 
fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S)72 void fmpz_mod_bpoly_stack_clear(fmpz_mod_bpoly_stack_t S)
73 {
74     slong i;
75 
76     FLINT_ASSERT(S->top == 0);
77 
78     for (i = 0; i < S->alloc; i++)
79     {
80         fmpz_mod_bpoly_clear(S->array[i], NULL);
81         flint_free(S->array[i]);
82     }
83 
84     flint_free(S->array);
85 }
86 
87 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_bpoly_stack_fit_request(fmpz_mod_bpoly_stack_t S,slong k)88 fmpz_mod_bpoly_struct ** fmpz_mod_bpoly_stack_fit_request(
89     fmpz_mod_bpoly_stack_t S,
90     slong k)
91 {
92     slong newalloc, i;
93 
94     FLINT_ASSERT(S->alloc >= S->top);
95 
96     if (S->top + k > S->alloc)
97     {
98         newalloc = FLINT_MAX(1, S->top + k);
99 
100         S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_bpoly_struct *);
101 
102         for (i = S->alloc; i < newalloc; i++)
103         {
104             S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_bpoly_struct);
105             fmpz_mod_bpoly_init(S->array[i], NULL);
106         }
107         S->alloc = newalloc;
108     }
109 
110     return S->array + S->top;
111 }
112 
113 
fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S)114 void fmpz_mod_polyun_stack_init(fmpz_mod_polyun_stack_t S)
115 {
116     S->alloc = 0;
117     S->array = NULL;
118     S->top = 0;
119 }
120 
fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S)121 void fmpz_mod_polyun_stack_clear(fmpz_mod_polyun_stack_t S)
122 {
123     slong i;
124 
125     FLINT_ASSERT(S->top == 0);
126 
127     for (i = 0; i < S->alloc; i++)
128     {
129         fmpz_mod_polyun_clear(S->array[i], NULL);
130         flint_free(S->array[i]);
131     }
132 
133     flint_free(S->array);
134 }
135 
136 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_polyun_stack_fit_request(fmpz_mod_polyun_stack_t S,slong k)137 fmpz_mod_polyun_struct ** fmpz_mod_polyun_stack_fit_request(
138     fmpz_mod_polyun_stack_t S,
139     slong k)
140 {
141     slong newalloc, i;
142 
143     FLINT_ASSERT(S->alloc >= S->top);
144 
145     if (S->top + k > S->alloc)
146     {
147         newalloc = FLINT_MAX(1, S->top + k);
148 
149         S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_polyun_struct *);
150 
151         for (i = S->alloc; i < newalloc; i++)
152         {
153             S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_polyun_struct);
154             fmpz_mod_polyun_init(S->array[i], NULL);
155         }
156         S->alloc = newalloc;
157     }
158 
159     return S->array + S->top;
160 }
161 
162 
163 
164 
165 
fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S,flint_bitcnt_t bits,const fmpz_mod_mpoly_ctx_t ctx)166 void fmpz_mod_mpolyn_stack_init(fmpz_mod_mpolyn_stack_t S,
167                            flint_bitcnt_t bits, const fmpz_mod_mpoly_ctx_t ctx)
168 {
169     S->alloc = 0;
170     S->array = NULL;
171     S->top = 0;
172     S->bits = bits;
173 }
174 
fmpz_mod_mpolyn_stack_clear(fmpz_mod_mpolyn_stack_t S,const fmpz_mod_mpoly_ctx_t ctx)175 void fmpz_mod_mpolyn_stack_clear(
176     fmpz_mod_mpolyn_stack_t S,
177     const fmpz_mod_mpoly_ctx_t ctx)
178 {
179     slong i;
180 
181     FLINT_ASSERT(S->top == 0);
182 
183     for (i = 0; i < S->alloc; i++)
184     {
185         fmpz_mod_mpolyn_clear(S->array[i], ctx);
186         flint_free(S->array[i]);
187     }
188 
189     flint_free(S->array);
190 }
191 
192 /* insure that k slots are available after top and return pointer to top */
fmpz_mod_mpolyn_stack_fit_request(fmpz_mod_mpolyn_stack_t S,slong k,const fmpz_mod_mpoly_ctx_t ctx)193 fmpz_mod_mpolyn_struct ** fmpz_mod_mpolyn_stack_fit_request(
194             fmpz_mod_mpolyn_stack_t S, slong k, const fmpz_mod_mpoly_ctx_t ctx)
195 {
196     slong newalloc, i;
197 
198     FLINT_ASSERT(S->alloc >= S->top);
199 
200     if (S->top + k > S->alloc)
201     {
202         newalloc = FLINT_MAX(1, S->top + k);
203 
204         S->array = FLINT_ARRAY_REALLOC(S->array, newalloc, fmpz_mod_mpolyn_struct *);
205 
206         for (i = S->alloc; i < newalloc; i++)
207         {
208             S->array[i] = FLINT_ARRAY_ALLOC(1, fmpz_mod_mpolyn_struct);
209             fmpz_mod_mpolyn_init(S->array[i], S->bits, ctx);
210         }
211         S->alloc = newalloc;
212     }
213 
214     return S->array + S->top;
215 }
216