-
Notifications
You must be signed in to change notification settings - Fork 0
/
factory.cpp
103 lines (86 loc) · 2.84 KB
/
factory.cpp
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
94
95
96
97
98
99
100
101
102
103
#include "factory.hpp"
#include <climits>
#include <limits>
//start canonical
Factory::Factory(void){
return;
};
Factory::~Factory(void){
return;
};
Factory::Factory(const Factory & _factory){
*this = _factory;
return;
};
Factory & Factory::operator=(const Factory &){
return *this;
};
//end canonical
//start factory
IOperand const * Factory::createOperand( eOperandType type, std::string const & value ) const {
factoryOverflow over;
factoryUnderflow under;
long double temp = stod(value);
if (type == 0){
if (temp > SCHAR_MAX){throw(over);}
else if (temp < SCHAR_MIN){throw (under);}
const IOperand *newOperand = createInt8(value);
return newOperand;
}
else if (type == 1){
if (temp > INT_MAX){throw(over);}
else if (temp < INT_MIN){throw (under);}
const IOperand *newOperand = createInt16(value);
return newOperand;
}
else if (type == 2){
if (temp > LONG_MAX){throw(over);}
else if (temp < LONG_MIN){throw (under);}
const IOperand *newOperand = createInt32(value);
return newOperand;
}
else if (type == 3){
if (temp > std::numeric_limits<float>::max()){throw(over);}
else if (temp < std::numeric_limits<float>::lowest()){throw (under);}
const IOperand *newOperand = createFloat(value);
return newOperand;
}
else if (type == 4){
if (temp > std::numeric_limits<double>::max()){throw(over);}
else if (temp < std::numeric_limits<double>::lowest()){throw (under);}
const IOperand *newOperand = createDouble(value);
return newOperand;
}
else{
//throw an error
const IOperand *newOperand;
return newOperand = createInt8(value);
}
};
IOperand const * Factory::createInt8( const std::string & value ) const{
Operand<signed char> *newOperand = new Operand<signed char>(value, Int8);
return newOperand;
};
IOperand const * Factory::createInt16( const std::string & value ) const{
Operand<int16_t> *newOperand = new Operand<int16_t>(value, Int16);
return newOperand;
};
IOperand const * Factory::createInt32( const std::string & value ) const{
Operand<int32_t> *newOperand = new Operand<int32_t>(value, Int32);
return newOperand;
};
IOperand const * Factory::createFloat( const std::string & value ) const{
Operand<float> *newOperand = new Operand<float>(value, Float);
return newOperand;
};
IOperand const * Factory::createDouble( const std::string & value ) const{
Operand<double> *newOperand = new Operand<double>(value, Double);
return newOperand;
};
//end factory
const char * Factory::factoryOverflow::what() const throw(){
return "Overflow on type assign";
}
const char * Factory::factoryUnderflow::what() const throw(){
return "Underflow on type assign";
}