Rocstar  1.0
Rocstar multiphysics simulation application
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
utilities/rc_cmp/util.cpp
Go to the documentation of this file.
1 #include "util.h"
2 
3 /*
4  * int to string conversion
5  */
6 string itoa(int n){
7  string s;
8  std::stringstream out;
9  out << n;
10  return out.str();
11 }
12 
13 bool check_non_numeric_char(char test_char){
14 
15  int num = (int)test_char;
16 
17  if(num > 57 || num < 48)
18  return true;
19 
20  return false;
21 }
22 
23 bool check_non_numeric_char_per(char test_char){
24 
25  int num = (int)test_char;
26 
27  if(num > 57 || num < 48 || test_char == '.')
28  return true;
29 
30  return false;
31 }
32 
33 bool check_non_numeric_str(string test_str){
34  for(int i=0; i<test_str.length(); i++){
35  if(check_non_numeric_char(test_str[i]))
36  return true;
37  }
38 
39  return false;
40 }
41 
42 bool check_non_numeric_str_per(string test_str){
43  for(int i=0; i<test_str.length(); i++){
44  if(check_non_numeric_char_per(test_str[i]))
45  return true;
46  }
47 
48  return false;
49 }
50 
51 bool check_delimiters(char *delimit, int num, char test){
52 
53  //Default delimiters if none are specified
54  if(delimit == NULL){
55  num = 4;
56  delimit = "\n\t \0";
57  }
58 
59  //Check for delimiters
60  for(int i=0; i < num; i++){
61  if(test == delimit[i])
62  return true;
63  }
64 
65  return false;
66 }
67 
68 
69 
70 //TODO
71 //Rewrite this ugly function using regex
72 
73 /*
74  * Read expressions of the form
75  * x = "test" "100" "another test"
76  */
77 std::vector<string> readQuoteExpression(string rStack, string rNeedle){
78 
79  std::vector<string> null_res;
80 
81  //
82  //Search for needle in stack
83  //
84 
85  bool needle_found;
86 
87  int i;
88  for(i=0; i < (rStack.length()-rNeedle.length()) + 1; i++){
89 
90  char check = '\0';
91  if( i > 0 )
92  check = rStack[i-1];
93 
94  if( i == 0 || check_delimiters(NULL, 0, check) ){
95 
96  needle_found = true;
97 
98  for(int j=0; j<rNeedle.length(); j++){
99  if( rStack[i+j] != rNeedle[j] )
100  needle_found = false;
101  }
102  }
103 
104  if(needle_found)
105  break;
106 
107  }
108 
109  //Not found
110  if(!needle_found)
111  return null_res;
112 
113  i += rNeedle.length();
114 
115 
116 
117  //
118  //Skip Whitespace, check for '='
119  //
120 
121  char c = rStack[i];
122  while(c == ' '){
123  i++;
124  c = rStack[i];
125  }
126 
127  //Check for '='
128  if(c != '=')
129  return null_res;
130  else
131  i++;
132 
133  c = rStack[i];
134  while(c == ' '){
135  i++;
136  c = rStack[i];
137  }
138 
139 
140  std::vector<string> values;
141 
142 
143 
144  //
145  //Read Values
146  //
147 
148  while(c == '"'){
149 
150  //Check for valid parentheses
151  int end = rStack.length();
152 
153  i++;
154  for(end=0; end<rStack.length(); end++){
155  c = rStack[i+end];
156  if(c == '"')
157  break;
158  }
159 
160  //Read value
161  string val("");
162 
163  int limit = end+i;
164 
165  for(i; i < limit; i++){
166  val += rStack[i];
167  }
168 
169  i++;
170 
171  values.push_back(val);
172 
173  //Skip whitespace
174  c = rStack[i];
175  while(c == ' '){
176  i++;
177  c = rStack[i];
178  }
179 
180  }
181 
182  return values;
183 }
184 
185 
186 
187 std::vector<string> readCommaExpression(string rStack, string rNeedle){
188 
189  std::vector<string> null_res;
190 
191 
192  //
193  //Search for needle in stack
194  //
195 
196  bool needle_found;
197 
198  int i;
199  for(i=0; i < (rStack.length()-rNeedle.length()) + 1; i++){
200 
201  char check = '\0';
202  if( i > 0 )
203  check = rStack[i-1];
204 
205  if( i == 0 || check_delimiters(NULL, 0, check) ){
206 
207  needle_found = true;
208 
209  for(int j=0; j<rNeedle.length(); j++){
210  if( rStack[i+j] != rNeedle[j] )
211  needle_found = false;
212  }
213  }
214 
215  if(needle_found)
216  break;
217 
218  }
219 
220  //Not found
221  if(!needle_found)
222  return null_res;
223 
224  i += rNeedle.length();
225 
226 
227 
228  //
229  //Skip Whitespace, check for '='
230  //
231 
232  char c = rStack[i];
233  while(c == ' '){
234  i++;
235  c = rStack[i];
236  }
237 
238  //Check for '='
239  if(c != '=')
240  return null_res;
241  else
242  i++;
243 
244  c = rStack[i];
245  while(c == ' '){
246  i++;
247  c = rStack[i];
248  }
249 
250 
251  std::vector<string> values;
252 
253 
254  //
255  //Read Values
256  //
257 
258  //Move back one character
259  // - Neccessary due to loop
260  i--;
261 
262  do{
263 
264  i++;
265  c = rStack[i];
266 
267  //Skip whitespace
268  while(c == ' '){
269  i++;
270  c = rStack[i];
271  }
272 
273  //Read value
274  string val("");
275 
276  while(c != ' ' && c != ',' && c != '='){
277  val += rStack[i];
278 
279  i++;
280  c = rStack[i];
281  }
282 
283  if( c == '=')
284  break;
285 
286  values.push_back(val);
287  }
288  while(c == ',');
289 
290 
291  return values;
292 }
293 
294 bool check_bool_arr(bool test[], int size){
295 
296  for(int i=0; i<size; i++){
297  if(!test[i])
298  return false;
299  }
300 
301  return true;
302 
303 }
304 
305 long double dist(long double *coord1, long double *coord2, int size){
306 
307  long double total = 0;
308 
309  for(int i=0; i<size; i++){
310  total += pow( coord2[i] - coord1[i], 2 );
311  }
312 
313  total = sqrt(total);
314 
315  return total;
316 }
317 
318 bool pnt_in_tri(pnt test, pnt p1, pnt p2, pnt p3){
319 
320  if(test.size < 2 || p1.size < 2 || p2.size < 2 || p3.size < 2)
321  return false;
322 
323  if( side_check(test, p1, p2, p3) &&
324  side_check(test, p2, p3, p1) &&
325  side_check(test, p3, p1, p2) ){
326  return true;
327  }
328 
329  return false;
330 }
331 
332 bool side_check(pnt test, pnt p1, pnt p2, pnt check){
333 
334  //Line to check
335  pnt line;
336  line.size = 3;
337  line.vals = new long double[3];
338 
339  line.vals[0] = p2.vals[0] - p1.vals[0];
340  line.vals[1] = p2.vals[1] - p1.vals[1];
341  line.vals[2] = 0.0;
342 
343  //Test point vector
344  pnt tpt;
345  tpt.size = 3;
346  tpt.vals = new long double[3];
347 
348  tpt.vals[0] = test.vals[0] - p1.vals[0];
349  tpt.vals[1] = test.vals[1] - p1.vals[1];
350  tpt.vals[2] = 0.0;
351 
352  //Check point vector
353  pnt checkvec;
354  checkvec.size = 3;
355  checkvec.vals = new long double[3];
356 
357  checkvec.vals[0] = check.vals[0] - p1.vals[0];
358  checkvec.vals[1] = check.vals[1] - p1.vals[1];
359  checkvec.vals[2] = 0.0;
360 
361  pnt res1 = cross_product(line, tpt);
362  pnt res2 = cross_product(line, checkvec);
363 
364  if( dot_product(res1, res2) >= 0.0 )
365  return true;
366 
367  return false;
368 }
369 
370 pnt cross_product(pnt vec1, pnt vec2){
371 
372  pnt ret;
373 
374  if(vec1.size < 3 || vec2.size < 3)
375  return ret;
376 
377  ret.size = 3;
378  ret.vals = new long double[3];
379 
380  ret.vals[0] = (vec1.vals[1]*vec2.vals[2] - vec1.vals[2]*vec2.vals[1]);
381  ret.vals[1] = (vec1.vals[2]*vec2.vals[0] - vec1.vals[0]*vec2.vals[2]);
382  ret.vals[2] = (vec1.vals[0]*vec2.vals[1] - vec1.vals[1]*vec2.vals[0]);
383 
384  return ret;
385 }
386 
387 long double dot_product(pnt vec1, pnt vec2){
388  if(vec1.size != vec2.size){
389  return nan();
390  }
391 
392  long double ret_val = 0.0;
393 
394  for(int i=0; i<vec1.size; i++){
395  ret_val += vec1.vals[i] * vec2.vals[i];
396  }
397 
398  return ret_val;
399 }
400 
401 long double nan(){
402 
403  //Return NaN without compiler warning
404  long double *zer = new long double;
405  *zer = 0.0;
406 
407  long double ret = ( (*zer) / (*zer) );
408  delete zer;
409 
410  return ret;
411 }
412 
413 std::vector<string> str_tokenize(string full, string delimiters){
414 
415  std::vector<string> ret;
416 
417  string::size_type start = full.find_first_not_of(delimiters, 0);
418  string::size_type end = full.find_first_of(delimiters, start);
419 
420  while(start != string::npos || end != string::npos){
421  ret.push_back(full.substr(start, end-start));
422 
423  start = full.find_first_not_of(delimiters, end);
424  end = full.find_first_of(delimiters, start);
425  }
426 
427  return ret;
428 }
429 
430 bool same_elements(std::vector<int> vector_1, std::vector<int> vector_2){
431  for(int vec1_element_num = 0; vec1_element_num < vector_1.size(); vec1_element_num++){
432 
433  bool match_found = false;
434  for(int vec2_element_num = 0; vec2_element_num < vector_2.size(); vec2_element_num++){
435 
436  //check for matching element
437  if(vector_1[vec1_element_num] == vector_2[vec2_element_num]){
438  match_found = true;
439  break;
440  }
441  }
442 
443  if(!match_found)
444  return false;
445  }
446 
447  return true;
448 }
449 
450 
451 
452 /* bitmap class -- efficient bit array -----------------------------------*/
453 
455  map_set = false;
456  return;
457 }
458 
460  if(map_set)
461  delete[] map;
462 }
463 
465  size = b.size;
466  map_set = b.map_set;
467 
468  int arr_size = size / (sizeof(int)*8);
469  arr_size++;
470 
471  if(map_set){
472  map = new int[arr_size];
473 
474  for(int i=0; i<arr_size; i++){
475  map[i] = b.map[i];
476  }
477  }
478 }
479 
481 
482  if(this != &b){
483 
484  if(map_set)
485  delete[] map;
486 
487  size = b.size;
488  map_set = b.map_set;
489 
490  int arr_size = size / (sizeof(int)*8);
491  arr_size++;
492 
493  if(map_set){
494  map = new int[arr_size];
495 
496  for(int i=0; i<arr_size; i++){
497  int temp = b.map[i];
498  map[i] = temp;
499  }
500  }
501  }
502 
503  return *this;
504 }
505 
506 void bitmap::set_size(int n){
507 
508  int new_size = n / (sizeof(int)*8);
509  new_size++;
510 
511  int old_size = size / (sizeof(int)*8);
512  old_size++;
513 
514  if(!map_set){
515 
516  map = new int[ new_size ];
517 
518  for(int i=0; i < new_size; i++){
519  map[i] = 0;
520  }
521  }
522  else{
523  int *temp;
524  temp = new int[ new_size ];
525 
526  for(int i=0; i < new_size; i++){
527  temp[i] = 0;
528  }
529 
530  for(int i=0; i < old_size; i++){
531  temp[i] = map[i];
532  }
533 
534  delete[] map;
535  map = temp;
536  }
537 
538  size = n;
539  map_set = true;
540 }
541 
543  return size;
544 }
545 
547 
548  int index = n / (sizeof(int) * 8);
549  int num = n % (sizeof(int) * 8);
550 
551  int entry = map[index];
552 
553  int set = 0x00000001;
554  set = set << num;
555 
556  entry = entry | set;
557 
558  map[index] = entry;
559 
560 }
561 
563 
564  int index = n / (sizeof(int) * 8);
565  int num = n % (sizeof(int) * 8);
566 
567  int entry = map[index];
568 
569  int set = 0x00000001;
570  set = set << num;
571  set = ~set;
572 
573  entry = entry & set;
574 
575  map[index] = entry;
576 
577 }
578 
580 
581  if(n >= size || n < 0)
582  return false;
583 
584  int index = n / (sizeof(int) * 8);
585  int num = n % (sizeof(int) * 8);
586 
587  int entry = map[index];
588 
589  entry = entry >> num;
590  entry = entry & 0x00000001;
591 
592  if(entry == 0x00000001)
593  return true;
594 
595  return false;
596 }
597 
int size
Definition: datatypedef.h:70
double s
Definition: blastest.C:80
bool check_non_numeric_char_per(char test_char)
long double nan()
NT p1
double sqrt(double d)
Definition: double.h:73
long double * vals
Definition: datatypedef.h:69
bool check_bool_arr(bool test[], int size)
std::vector< string > readCommaExpression(string rStack, string rNeedle)
Point object that represents a single point.
Definition: datatypedef.h:68
string itoa(int n)
Convert an int to a string.
void set_value(int n)
bool check_value(int n)
VectorS3< FT > cross_product(const VectorS3< FT > &v, const VectorS3< FT > &w)
void unset_value(int n)
bool check_non_numeric_char(char test_char)
blockLoc i
Definition: read.cpp:79
void test(void)
Definition: flotsam.C:99
bool check_non_numeric_str_per(string test_str)
void set_size(int n)
const NT & n
bitmap & operator=(const bitmap &b)
j indices j
Definition: Indexing.h:6
std::vector< string > readQuoteExpression(string rStack, string rNeedle)
Read expressions of the form x = &quot;test&quot; &quot;100&quot; &quot;another test&quot;.
bool pnt_in_tri(pnt test, pnt p1, pnt p2, pnt p3)
long double dist(long double *coord1, long double *coord2, int size)
bool same_elements(std::vector< int > vector_1, std::vector< int > vector_2)
long double dot_product(pnt vec1, pnt vec2)
bool side_check(pnt test, pnt p1, pnt p2, pnt check)
std::vector< string > str_tokenize(string full, string delimiters)
double pow(double value, const Exponent &exp)
bool check_non_numeric_str(string test_str)
bool check_delimiters(char *delimit, int num, char test)