File: RangeList.C

package info (click to toggle)
paraview 4.0.1-1~bpo70%2B1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy-backports
  • size: 526,572 kB
  • sloc: cpp: 2,284,430; ansic: 816,374; python: 239,936; xml: 70,162; tcl: 48,295; fortran: 39,116; yacc: 5,466; java: 3,518; perl: 3,107; lex: 1,620; sh: 1,555; makefile: 932; asm: 471; pascal: 228
file content (92 lines) | stat: -rw-r--r-- 2,549 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include "RangeList.h"
#include <iostream> 
#include <fstream>
#include <algorithm>
#define RANGE_LIST_SOURCE_ID "$Id: RangeList.C,v 1.5 2005/03/07 18:58:08 rcook Exp $"
void PrintVersion(void) {
  cout << "Range List header is " << RANGE_LIST_HEADER_ID << " and source is " << RANGE_LIST_SOURCE_ID << endl; 
  return; 
}

using namespace std; 
// for templated searches:
bool operator < (long num, const range &r)   { return r > num;}
bool operator > (long num, const range &r)   { return r < num;}
bool operator ==(long num, const range &r)   { return r.Contains(num);}
bool operator ==(const range &r, long num)   { return r.Contains(num);}

void RangeList::Print(void) {
  cout << "printing range list: " << endl; 
  vector<range>::iterator pos = ranges.begin(), end = ranges.end();
  while (pos != end){
    pos->Print();
    ++pos;
  }
  cout << "end of range list." << endl; 
  return; 
}


void RangeList::AddRange(long start, long end){  
  if (end < start)
    throw string("AddRange: start is greater than end!");

  ranges.push_back(range(start, end)); 
  if (verbose)
    cout << "RangeList:AddRange(" << start << ", " << end <<")" << endl; 
  return; 
}

void RangeList::GetOneRange(ifstream &filterfile) {
  long start, end; 
  char token; 
  while (filterfile >> start) {
    //if we immediately see a number, then it is just a number; treat it like a range
    AddRange(start, start); 
    return; 
  }

  // did not see a number 
  filterfile.clear();
  filterfile >> token; 
  if (token == ',') { 
    // a comma is optional; just ignore it and move on
    return; 
  }

  // if we don't see a number or a comma, then it's a range, starting with '['
  if (filterfile.eof())
    return; 

  if (token != '[' ) 
      throw string("Expected  '[' in range but got \"")+token+string("\"");
    
  if (!(filterfile >> start))
    throw string("Did not find a number after opening bracket in range.");

  filterfile >> token; 
  if (token != '-') 
    throw string("Expected dash; found \"")+token+"\" in range after number";

  if (!(filterfile >> end))
    throw string("Did not find a number after dash in range.");
  
  filterfile >> token; 
  if (token != ']' ) 
      throw string("Expected ']' in range but got \"")+token+string("\"");

  AddRange(start, end);
  return; 
}

void RangeList::Parse(char *filename) {

  ifstream filterfile(filename);
  if (!filterfile)
    throw string("Could not open filter file ")+string(filename); 

  while (!filterfile.eof() && !filterfile.bad()) 
    GetOneRange(filterfile);

  return; 
}