GNU PROLOG with UTF8 support
fd_range.h
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------*
2  * GNU Prolog *
3  * *
4  * Part : FD constraint solver *
5  * File : fd_range.h *
6  * Descr.: FD Range Implementation - header file *
7  * Author: Daniel Diaz *
8  * *
9  * Copyright (C) 1999-2015 Daniel Diaz *
10  * *
11  * This file is part of GNU Prolog *
12  * *
13  * GNU Prolog is free software: you can redistribute it and/or *
14  * modify it under the terms of either: *
15  * *
16  * - the GNU Lesser General Public License as published by the Free *
17  * Software Foundation; either version 3 of the License, or (at your *
18  * option) any later version. *
19  * *
20  * or *
21  * *
22  * - the GNU General Public License as published by the Free *
23  * Software Foundation; either version 2 of the License, or (at your *
24  * option) any later version. *
25  * *
26  * or both in parallel, as here. *
27  * *
28  * GNU Prolog is distributed in the hope that it will be useful, *
29  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
30  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
31  * General Public License for more details. *
32  * *
33  * You should have received copies of the GNU General Public License and *
34  * the GNU Lesser General Public License along with this program. If *
35  * not, see http://www.gnu.org/licenses/. *
36  *-------------------------------------------------------------------------*/
37 
38 
39 #include "bool.h"
40 #include "pl_long.h"
41 
42 /*---------------------------------*
43  * Constants *
44  *---------------------------------*/
45 
46 /*---------------------------------*
47  * Type Definitions *
48  *---------------------------------*/
49 
50 typedef PlULong VecWord;
51 
52 typedef VecWord *Vector;
53 
54 typedef struct /* Ranges are always handled through pointers */
55 {
57  int min;
58  int max;
60 }
61 Range;
62 
63 
64 
65 
66 /*---------------------------------*
67  * Global Variables *
68  *---------------------------------*/
69 
70 #include "fd_hook_range.h"
71 
72  /* Default definitions (if not defined in fd_hook_range.h) */
73 
74 #ifndef WORD_SIZE
75 # define WORD_SIZE 32
76 #endif
77 
78 
79 
80 #if WORD_SIZE == 32
81 
82 # define WORD_SIZE_BITS 5
83 
84 #else
85 
86 # define WORD_SIZE_BITS 6
87 
88 #endif
89 
90 
91 
92 
93 /*---------------------------------*
94  * Function Prototypes *
95  *---------------------------------*/
96 
97 void Pl_Define_Vector_Size(int max_val);
98 
99 void Pl_Vector_From_Interval(Vector vec, int min, int max);
100 
101 int Pl_Vector_Nb_Elem(Vector vec);
102 
103 int Pl_Vector_Ith_Elem(Vector vec, int n);
104 
105 int Pl_Vector_Next_After(Vector vec, int n);
106 
107 int Pl_Vector_Next_Before(Vector vec, int n);
108 
109 void Pl_Vector_Empty(Vector vec);
110 
111 void Pl_Vector_Full(Vector vec);
112 
114 
115 void Pl_Vector_Copy(Vector vec, Vector vec1);
116 
117 void Pl_Vector_Union(Vector vec, Vector vec1);
118 
119 void Pl_Vector_Inter(Vector vec, Vector vec1);
120 
121 void Pl_Vector_Compl(Vector vec);
122 
123 void Pl_Vector_Add_Vector(Vector vec, Vector vec1);
124 
125 void Pl_Vector_Sub_Vector(Vector vec, Vector vec1);
126 
127 void Pl_Vector_Mul_Vector(Vector vec, Vector vec1);
128 
129 void Pl_Vector_Div_Vector(Vector vec, Vector vec1);
130 
131 void Pl_Vector_Mod_Vector(Vector vec, Vector vec1);
132 
133 void Pl_Vector_Add_Value(Vector vec, int n);
134 
135 void Pl_Vector_Mul_Value(Vector vec, int n);
136 
137 void Pl_Vector_Div_Value(Vector vec, int n);
138 
139 void Pl_Vector_Mod_Value(Vector vec, int n);
140 
141 Bool Pl_Range_Test_Value(Range *range, int n);
142 
143 Bool Pl_Range_Test_Null_Inter(Range *range, Range *range1);
144 
145 void Pl_Range_Copy(Range *range, Range *range1);
146 
147 int Pl_Range_Nb_Elem(Range *range);
148 
149 int Pl_Range_Ith_Elem(Range *range, int n);
150 
151 int Pl_Range_Next_After(Range *range, int n);
152 
153 int Pl_Range_Next_Before(Range *range, int n);
154 
155 void Pl_Range_Set_Value(Range *range, int n);
156 
157 void Pl_Range_Reset_Value(Range *range, int n);
158 
159 void Pl_Range_Becomes_Sparse(Range *range);
160 
161 void Pl_Range_From_Vector(Range *range);
162 
163 void Pl_Range_Union(Range *range, Range *range1);
164 
165 void Pl_Range_Inter(Range *range, Range *range1);
166 
167 void Pl_Range_Compl(Range *range);
168 
169 void Pl_Range_Add_Range(Range *range, Range *range1);
170 
171 void Pl_Range_Sub_Range(Range *range, Range *range1);
172 
173 void Pl_Range_Mul_Range(Range *range, Range *range1);
174 
175 void Pl_Range_Div_Range(Range *range, Range *range1);
176 
177 void Pl_Range_Mod_Range(Range *range, Range *range1);
178 
179 void Pl_Range_Add_Value(Range *range, int n);
180 
181 void Pl_Range_Mul_Value(Range *range, int n);
182 
183 void Pl_Range_Div_Value(Range *range, int n);
184 
185 void Pl_Range_Mod_Value(Range *range, int n);
186 
187 char *Pl_Range_To_String(Range *range);
188 
189 
190 
191 
192 /*---------------------------------*
193  * Vector Management Macros *
194  *---------------------------------*/
195 
196 #define Word_No_And_Bit_No(w, b) (((VecWord) (w) << WORD_SIZE_BITS)|\
197  (VecWord) (b))
198 #define Word_No(n) ((VecWord) (n) >> WORD_SIZE_BITS)
199 #define Bit_No(n) ((n) & (((VecWord) 1 << WORD_SIZE_BITS)-1))
200 
201 
202 
203 #define Vector_Test_Value(vec, n) ((vec[Word_No(n)] & ((VecWord) 1 << Bit_No(n))) != 0)
204 
205 
206 
207 
208 #define Vector_Set_Value(vec, n) (vec[Word_No(n)] |= ((VecWord) 1 << Bit_No(n)))
209 
210 
211 
212 
213 #define Vector_Reset_Value(vec, n) (vec[Word_No(n)] &= ~((VecWord) 1 << Bit_No(n)))
214 
215 
216 
217 
218 #define Vector_Allocate_If_Necessary(vec) \
219  do \
220  { \
221  if (vec == NULL) \
222  Vector_Allocate(vec); \
223  } \
224  while (0)
225 
226 
227 
228 
229 #define Vector_Allocate(vec) \
230  do \
231  { \
232  vec = (Vector) RANGE_TOP_STACK; \
233  RANGE_TOP_STACK += pl_vec_size; \
234  } \
235  while (0)
236 
237 
238 
239 
240  /* To enumerate a vector use VECTOR_BEGIN_ENUM / VECTOR_END_ENUM *
241  * macros as follows: *
242  * ... *
243  * VECTOR_BEGIN_ENUM(the_vector,vec_elem) *
244  * your code (vec_elem contains the current range element) *
245  * VECTOR_END_ENUM */
246 
247 #define VECTOR_BEGIN_ENUM(vec, vec_elem) \
248 { \
249  Vector enum_end = vec + pl_vec_size, enum_i = vec; \
250  int enum_j; \
251  VecWord enum_word; \
252  \
253  vec_elem = 0; \
254  do \
255  { \
256  enum_word = *enum_i; \
257  for (enum_j = 0; enum_j++ < WORD_SIZE; enum_word >>= 1, vec_elem++) \
258  { \
259  if (enum_word & 1) \
260  {
261 
262 
263 #define VECTOR_END_ENUM \
264  } \
265  } \
266  } \
267  while (++enum_i < enum_end); \
268 }
269 
270 
271 
272 
273 /*---------------------------------*
274  * Range Management Macros *
275  *---------------------------------*/
276 
277 #define Is_Interval(range) ((range)->vec == NULL)
278 #define Is_Sparse(range) ((range)->vec != NULL)
279 #define Is_Empty(range) ((range)->min > (range)->max)
280 #define Is_Not_Empty(range) ((range)->max >= (range)->min)
281 
282 
283 #define Set_To_Empty(range) (range)->max = (int)(1 << (sizeof(int) * 8 - 1))
284 
285 
286 #define Range_Init_Interval(range, r_min, r_max) \
287  do \
288  { \
289  (range)->extra_cstr = FALSE; \
290  (range)->min = (r_min); \
291  (range)->max = (r_max); \
292  (range)->vec = NULL; \
293  } \
294  while (0)
295 
void Pl_Vector_Mul_Vector(Vector vec, Vector vec1)
Definition: fd_range.c:520
void Pl_Vector_Div_Vector(Vector vec, Vector vec1)
Definition: fd_range.c:556
void Pl_Vector_Empty(Vector vec)
Definition: fd_range.c:328
void Pl_Range_Sub_Range(Range *range, Range *range1)
Definition: fd_range.c:1366
void Pl_Vector_Compl(Vector vec)
Definition: fd_range.c:432
Vector vec
Definition: fd_range.h:59
void Pl_Range_Union(Range *range, Range *range1)
Definition: fd_range.c:1151
Bool Pl_Range_Test_Value(Range *range, int n)
Definition: fd_range.c:793
void Pl_Vector_Div_Value(Vector vec, int n)
Definition: fd_range.c:731
void Pl_Vector_Copy(Vector vec, Vector vec1)
Definition: fd_range.c:381
void Pl_Vector_Mod_Value(Vector vec, int n)
Definition: fd_range.c:763
void Pl_Vector_From_Interval(Vector vec, int min, int max)
Definition: fd_range.c:140
VecWord * Vector
Definition: fd_range.h:52
void Pl_Range_Mul_Value(Range *range, int n)
Definition: fd_range.c:1560
void Pl_Vector_Sub_Vector(Vector vec, Vector vec1)
Definition: fd_range.c:485
PlULong VecWord
Definition: fd_range.h:50
void Pl_Range_Reset_Value(Range *range, int n)
Definition: fd_range.c:1101
void Pl_Vector_Full(Vector vec)
Definition: fd_range.c:345
void Pl_Vector_Mul_Value(Vector vec, int n)
Definition: fd_range.c:701
void Pl_Range_From_Vector(Range *range)
Definition: fd_range.c:1008
void Pl_Vector_Mod_Vector(Vector vec, Vector vec1)
Definition: fd_range.c:595
int Pl_Range_Next_Before(Range *range, int n)
Definition: fd_range.c:957
void Pl_Range_Inter(Range *range, Range *range1)
Definition: fd_range.c:1211
int Pl_Vector_Ith_Elem(Vector vec, int n)
Definition: fd_range.c:199
void Pl_Range_Div_Range(Range *range, Range *range1)
Definition: fd_range.c:1453
int Pl_Range_Ith_Elem(Range *range, int n)
Definition: fd_range.c:902
void Pl_Vector_Inter(Vector vec, Vector vec1)
Definition: fd_range.c:415
void Pl_Range_Mod_Range(Range *range, Range *range1)
Definition: fd_range.c:1491
void Pl_Range_Add_Value(Range *range, int n)
Definition: fd_range.c:1530
void Pl_Vector_Add_Value(Vector vec, int n)
Definition: fd_range.c:628
int min
Definition: fd_range.h:57
void Pl_Range_Set_Value(Range *range, int n)
Definition: fd_range.c:1045
void Pl_Range_Becomes_Sparse(Range *range)
Definition: fd_range.c:986
int Pl_Range_Nb_Elem(Range *range)
Definition: fd_range.c:885
Bool Pl_Range_Test_Null_Inter(Range *range, Range *range1)
Definition: fd_range.c:815
Definition: fd_range.h:54
int Pl_Vector_Nb_Elem(Vector vec)
Definition: fd_range.c:176
void Pl_Vector_Add_Vector(Vector vec, Vector vec1)
Definition: fd_range.c:449
void Pl_Range_Compl(Range *range)
Definition: fd_range.c:1258
Bool extra_cstr
Definition: fd_range.h:56
void Pl_Range_Div_Value(Range *range, int n)
Definition: fd_range.c:1586
void Pl_Range_Add_Range(Range *range, Range *range1)
Definition: fd_range.c:1316
void Pl_Range_Mul_Range(Range *range, Range *range1)
Definition: fd_range.c:1415
char * Pl_Range_To_String(Range *range)
Definition: fd_range.c:1692
Bool Pl_Vector_Test_Null_Inter(Vector vec, Vector vec1)
Definition: fd_range.c:362
#define Range(fdv_adr)
Definition: fd_inst.h:64
void Pl_Range_Mod_Value(Range *range, int n)
Definition: fd_range.c:1612
int Pl_Vector_Next_After(Vector vec, int n)
Definition: fd_range.c:224
int max
Definition: fd_range.h:58
void Pl_Vector_Union(Vector vec, Vector vec1)
Definition: fd_range.c:398
int Bool
Definition: bool.h:65
void Pl_Define_Vector_Size(int max_val)
Definition: fd_range.c:126
void Pl_Range_Copy(Range *range, Range *range1)
Definition: fd_range.c:862
uintptr_t PlULong
Definition: gprolog.h:90
int Pl_Range_Next_After(Range *range, int n)
Definition: fd_range.c:928
int Pl_Vector_Next_Before(Vector vec, int n)
Definition: fd_range.c:276