-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsafeint.cpp
More file actions
89 lines (69 loc) · 1.74 KB
/
safeint.cpp
File metadata and controls
89 lines (69 loc) · 1.74 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
// Implement the functions here
#include "safeint.h"
#include <iostream>
SafeInt::SafeInt(SafeInt const &obj)
{
value = obj.value;
}
int SafeInt::getvalue() const
{
return value;
}
void SafeInt::operator++()
{
if ((value + 1) > INT_MAX or (value + 1) < 0)
throw std::overflow_error("Overflowed!");
++value;
}
SafeInt SafeInt::operator*(SafeInt const &obj)
{
SafeInt result(0);
result.value = value * obj.value;
if ((value > 0 && obj.value <0) or (value < 0 && obj.value >0))
{
if (result.value < INT_MIN or result.value > 0)
throw std::overflow_error("Underflowed!");
}
else if (result.value < INT_MAX or result.value < 0)
throw std::overflow_error("Overflowed!");
return result;
}
SafeInt SafeInt::operator+(SafeInt const &obj)
{
SafeInt result(0);
result.value = value + obj.value;
if (value >= obj.value)
{
if (result.value > INT_MAX or result.value < 0)
throw std::overflow_error("Overflowed!");
}
else if (result.value < INT_MIN or result.value > 0)
throw std::overflow_error("Underflowed!");
return result;
}
SafeInt SafeInt::operator-(SafeInt const &obj)
{
SafeInt result(0);
result.value = value - obj.value;
if (value >= obj.value)
{
if (result.value > INT_MAX or result.value < 0)
throw std::overflow_error("Overflowed!");
}
else if (result.value < INT_MIN or result.value > 0)
throw std::overflow_error("Underflowed!");
return result;
}
int SafeInt::operator()()
{
return value;
}
void SafeInt::operator=(int const &v)
{
value = v;
}
std::ostream &operator<<(std::ostream &stream, SafeInt const &obj)
{
stream << obj.getvalue();
return stream;
}