-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathbarzer_el_pattern_number.cpp
More file actions
93 lines (86 loc) · 2.23 KB
/
Copy pathbarzer_el_pattern_number.cpp
File metadata and controls
93 lines (86 loc) · 2.23 KB
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
93
#include <barzer_el_pattern_number.h>
#define TAG_CLOSE_STR "/>"
namespace barzer {
std::ostream& BTND_Pattern_Number::print( std::ostream& fp, const BELPrintContext& ) const
{
switch( type ) {
case T_ANY_NUMBER:
fp << "AnyNum";
break;
case T_ANY_INT:
fp << "AnyInt";
break;
case T_ANY_REAL:
fp << "AnyReal";
break;
case T_RANGE_INT:
fp << "RangeInt[" << range.integer.lo << "," << range.integer.hi << "]";
break;
case T_RANGE_REAL:
fp << "RangeReal[" << range.real.lo << "," << range.real.hi << "]";
break;
default:
return ( fp << "NumUnknown" );
}
return fp;
}
std::ostream& BTND_Pattern_Number::printXML( std::ostream& fp, const GlobalPools& gp ) const
{
fp << "<n";
if( d_asciiLen ) {
fp << " w=\"" << d_asciiLen << '"';
}
switch( type ) {
case T_ANY_INT: break;
case T_ANY_REAL:
fp << " r =\"y\"";
break;
case T_RANGE_INT:
fp << " l=\"" << range.integer.lo << "\" h=\"" << range.integer.hi << "\""; break;
case T_RANGE_REAL:
fp << " l=\"" << range.real.lo << "\" h=\"" << range.real.hi << "\""; break;
case T_ANY_NUMBER: break;
}
return fp << TAG_CLOSE_STR;
}
bool BTND_Pattern_Number::operator() ( const BarzerNumber& num ) const
{
uint8_t len = getAsciiLen();
if(len && len!= num.getAsciiLen())
return false;
switch( type ) {
case T_ANY_NUMBER: return true;
case T_ANY_INT: return num.isInt();
case T_ANY_REAL: return true;
case T_RANGE_INT:
if( num.isInt() ) {
int n = num.getInt_unsafe();
if( rangeType == RT_FULL )
return( n <= range.integer.hi && n>=range.integer.lo );
else if( rangeType == RT_NOHI )
return( n>=range.integer.lo );
else if( rangeType == RT_NOLO )
return( n <= range.integer.hi );
else
return true;
} else
return false;
case T_RANGE_REAL:
{
double n = num.getReal();
if( rangeType == RT_FULL )
return( n <= range.real.hi && n>=range.real.lo );
else if( rangeType == RT_NOHI )
return( n>=range.real.lo );
else if( rangeType == RT_NOLO )
return( n <= range.real.hi );
else
return true;
}
break;
default:
return false;
}
return false;
}
} // namespace barzer