-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsimple_inheritance_ranges.cpp
67 lines (59 loc) · 2 KB
/
simple_inheritance_ranges.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
//
// Bad idea credit: me
//
// Purpose: Create a control flow system for bounds checking results based on
// pattern matching "catch" statements
//
// Issues: It creates an exponential explosion of new types even for fairly
// small numbers and small ranges
//
#include <iostream>
#include <cstdint>
template<typename parent, bool predicate> class inherit_if;
template<typename parent> class inherit_if<parent, false> {};
template<typename parent> class inherit_if<parent, true> : public parent {};
class num_base {
public:
virtual size_t value() const = 0;
};
class range_base {
public:
size_t value() const {
return 0;
}
};
template<size_t mn, size_t mx>
class range : public range_base {};
// Ideally we could reuse some of this machinery so we don't create n classes
// for each instance of the number
template<size_t num, size_t mn, size_t mx, size_t mnn, size_t mxx>
class inherit_range :
public range<mn,mx>,
public inherit_range<num, mn-1, mx, mnn, mxx> {};
template<size_t num, size_t mx, size_t mnn, size_t mxx>
class inherit_range<num, mnn, mx, mnn, mxx> :
public range<mnn,mx>,
public inherit_range<num, num, mx+1, mnn, mxx>{};
template<size_t num, size_t mnn, size_t mxx>
class inherit_range<num, mnn, mxx, mnn, mxx> {};
template<size_t num, size_t mnn, size_t mxx>
class inherit_num : public inherit_if<inherit_range<num, num, num, mnn, mxx>,
(num > mnn && num < mxx)>,
public num_base {
public:
virtual size_t value() const { return num; }
};
constexpr size_t sm_range = 255;
template<size_t num>
using small_num = inherit_num<num, 0, sm_range>;
int main() {
try {
throw small_num<40>();
} catch(const range<2, 14>& r) {
std::cout << "In Range A: " << r.value() << std::endl;
} catch(const range<15, 20>& r) {
std::cout << "In Range B: " << r.value() << std::endl;
} catch(const range_base& r) {
std::cout << "Not in Range: " << r.value() << std::endl;
}
}