summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ue5/Makefile3
-rw-r--r--ue5/array.hpp136
-rw-r--r--ue5/mean_mark.hpp14
-rw-r--r--ue5/shared_ptr.hpp99
-rw-r--r--ue5/verwendung.cpp258
5 files changed, 295 insertions, 215 deletions
diff --git a/ue5/Makefile b/ue5/Makefile
index 2c98aaa..53fd8f5 100644
--- a/ue5/Makefile
+++ b/ue5/Makefile
@@ -30,6 +30,9 @@ debug:
30clean: 30clean:
31 rm -f $(OBJS) $(BIN) 31 rm -f $(OBJS) $(BIN)
32 32
33run test: all
34 @./test/test.sh
35
33.PHONY: clean 36.PHONY: clean
34 37
35# vim600: noet sw=8 ts=8 38# vim600: noet sw=8 ts=8
diff --git a/ue5/array.hpp b/ue5/array.hpp
index 19cdc02..37a33b4 100644
--- a/ue5/array.hpp
+++ b/ue5/array.hpp
@@ -2,44 +2,116 @@
2#define ARRAY_H 2#define ARRAY_H
3 3
4#undef SOLVED_2 4#undef SOLVED_2
5//#define SOLVED_2 5#define SOLVED_2
6 6
7/* TODO Includes */ 7/* TODO:
8 * Angabe: Im Gegensatz zu den Beispielen bis jetzt ist die Verwendung
9 * der STL und Boostuntersagt!
10 */
11#include <utility> // for std::move
12#include <stdexcept> // for std::out_of_range
13#include <algorithm> // for std::fill_n + std::swap_ranges
8 14
9namespace Ti 15namespace Ti
10{ 16{
17 template<typename T, size_t N>
18 struct array
19 {
20 typedef T& reference;
21 typedef const T& const_reference;
22 typedef T* iterator;
23 typedef const T* const_iterator;
24 typedef size_t size_type;
11 25
12/* TODO */ 26 static_assert(N != 0, "array<T, 0> not allowed");
13struct array 27
14{ 28 void fill (const T& u)
15 /* TODO typedef */ 29 {
16 30 std::fill_n(begin(), size(), u);
17 /* TODO static_assert */ 31 }
18 32
19 /* TODO: 33 void swap (array<T,N> & other)
20 void fill (const T& u); 34 {
21 void swap (array<T,N> & other); 35 std::swap_ranges(begin(), end(), other.begin());
22 iterator begin(); 36 }
23 const_iterator begin() const; 37
24 iterator end(); 38 iterator begin()
25 const_iterator end() const; 39 {
26 size_type size() const; 40 return m_data;
27 size_type max_size() const; 41 }
28 bool empty() const; 42
29 reference operator[] (size_type n); 43 const_iterator begin() const
30 const_reference operator[] (size_type n) const; 44 {
31 reference at(size_type n); 45 return m_data;
32 const_reference at (size_type n) const; 46 }
33 T* data(); 47
34 */ 48 iterator end()
35 49 {
36private: 50 return m_data + size();
37 /* TODO data */ 51 }
38}; 52
39 53 const_iterator end() const
40/* TODO */ 54 {
41array/* TODO */&& make_array(); 55 return m_data + size();
56 }
57
58 size_type size() const
59 {
60 return N;
61 }
62
63 size_type max_size() const
64 {
65 return N;
66 }
67
68 bool empty() const
69 {
70 return false; /* size() == 0 */
71 }
72
73 reference operator[] (size_type n)
74 {
75 return m_data[n];
76 }
77
78 const_reference operator[] (size_type n) const
79 {
80 return m_data[n];
81 }
82
83 reference at(size_type n)
84 {
85 if (n >= size())
86 throw std::out_of_range("array::at");
87 return m_data[n];
88 }
89
90 const_reference at (size_type n) const
91 {
92 if (n >= size())
93 throw std::out_of_range("array::at");
94 return m_data[n];
95 }
96
97 T* data()
98 {
99 return m_data;
100 }
101
102 private:
103 T m_data[N];
104 };
105
106 /* TODO: was macht std::move() genau?! :) */
107 template<typename T, size_t N>
108 array<T, N>&& make_array()
109 {
110 return std::move(array<T, N>());
111 }
42 112
43} // namespace 113} // namespace
44 114
45#endif 115#endif
116
117/* vim: set et sw=2 ts=2: */
diff --git a/ue5/mean_mark.hpp b/ue5/mean_mark.hpp
index 671090a..f35910c 100644
--- a/ue5/mean_mark.hpp
+++ b/ue5/mean_mark.hpp
@@ -7,15 +7,17 @@
7namespace Ti 7namespace Ti
8{ 8{
9 9
10template <typename Iter> 10 template <typename Iter>
11double mean_mark(Iter first, Iter last); 11 double mean_mark(Iter first, Iter last);
12 12
13template <typename Iter> 13 template <typename Iter>
14double mean_mark_student(Iter first, Iter last); 14 double mean_mark_student(Iter first, Iter last);
15 15
16template <class ForwardIterator> 16 template <class ForwardIterator>
17ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark); 17 ForwardIterator remove_greater (ForwardIterator first, ForwardIterator last, int mark);
18 18
19} 19}
20 20
21#endif 21#endif
22
23/* vim: set et sw=2 ts=2: */
diff --git a/ue5/shared_ptr.hpp b/ue5/shared_ptr.hpp
index 87e4b01..4492fff 100644
--- a/ue5/shared_ptr.hpp
+++ b/ue5/shared_ptr.hpp
@@ -8,78 +8,79 @@
8 8
9namespace Ti { 9namespace Ti {
10 10
11/* TODO helpers */ 11 /* TODO helpers */
12 12
13template <typename T> 13 template <typename T>
14class shared_ptr 14 class shared_ptr
15{ 15 {
16private: 16 private:
17 /* TODO data */ 17 /* TODO data */
18 18
19public: 19 public:
20 shared_ptr(); 20 shared_ptr();
21 T* get() const; 21 T* get() const;
22 shared_ptr (const shared_ptr<T>& other); 22 shared_ptr (const shared_ptr<T>& other);
23 23
24 template <typename O> 24 template <typename O>
25 shared_ptr (const shared_ptr<O>& other); 25 shared_ptr (const shared_ptr<O>& other);
26 26
27 template <typename O> 27 template <typename O>
28 explicit shared_ptr (O* p); 28 explicit shared_ptr (O* p);
29 shared_ptr& operator = (const shared_ptr<T>& other); 29 shared_ptr& operator = (const shared_ptr<T>& other);
30 30
31 template <typename O> 31 template <typename O>
32 shared_ptr& operator = (const shared_ptr<O>& other); 32 shared_ptr& operator = (const shared_ptr<O>& other);
33 33
34 ~shared_ptr (); 34 ~shared_ptr ();
35 T& operator * () const; 35 T& operator * () const;
36 T* operator -> () const; 36 T* operator -> () const;
37 37
38 void swap (shared_ptr<T>& other); 38 void swap (shared_ptr<T>& other);
39 39
40 inline void reset(); 40 inline void reset();
41 41
42private: 42 private:
43 template <typename R, typename... Args> 43 template <typename R, typename... Args>
44 friend shared_ptr<R> make_shared (Args...); 44 friend shared_ptr<R> make_shared (Args...);
45 45
46 template<typename U1, typename U2> 46 template<typename U1, typename U2>
47 friend bool operator == (const shared_ptr<U1>& a, const shared_ptr<U2>& b); 47 friend bool operator == (const shared_ptr<U1>& a, const shared_ptr<U2>& b);
48 48
49 template<typename U1, typename U2> 49 template<typename U1, typename U2>
50 friend bool operator == (const shared_ptr<U1>& a, const U2* b); 50 friend bool operator == (const shared_ptr<U1>& a, const U2* b);
51 51
52 template<typename U1, typename U2> 52 template<typename U1, typename U2>
53 friend bool operator == (const U1* a, const shared_ptr<U2>& b); 53 friend bool operator == (const U1* a, const shared_ptr<U2>& b);
54 54
55 template<typename U1, typename U2> 55 template<typename U1, typename U2>
56 friend bool operator != (const shared_ptr<U1>& a, const U2* b); 56 friend bool operator != (const shared_ptr<U1>& a, const U2* b);
57 57
58 template<typename U1, typename U2> 58 template<typename U1, typename U2>
59 friend bool operator != (const U1* a, const shared_ptr<U2>& b); 59 friend bool operator != (const U1* a, const shared_ptr<U2>& b);
60 60
61 template<typename U1, typename U2> 61 template<typename U1, typename U2>
62 friend bool operator != (const shared_ptr<U1>& a, const shared_ptr<U2>& b); 62 friend bool operator != (const shared_ptr<U1>& a, const shared_ptr<U2>& b);
63 63
64 template <typename R, typename F> 64 template <typename R, typename F>
65 friend shared_ptr<R> shared_dynamic_cast (const shared_ptr<F>& from); 65 friend shared_ptr<R> shared_dynamic_cast (const shared_ptr<F>& from);
66}; 66 };
67 67
68 68
69template <typename T /* TODO */ > 69 template <typename T /* TODO */ >
70shared_ptr<T> make_shared (/* TODO */); 70 shared_ptr<T> make_shared (/* TODO */);
71 71
72 72 template <typename T, typename F>
73template <typename T, typename F> 73 shared_ptr<T> shared_dynamic_cast (const shared_ptr<F>& from);
74shared_ptr<T> shared_dynamic_cast (const shared_ptr<F>& from);
75 74
76} // end namespace ti 75} // end namespace ti
77 76
78namespace std { 77namespace std {
79 using namespace Ti; 78 using namespace Ti;
80 template <typename T> 79 template <typename T>
81 inline void swap (shared_ptr<T>& t1, shared_ptr<T>& t2); 80 inline void swap (shared_ptr<T>& t1, shared_ptr<T>& t2);
82 /* TODO */ 81 /* TODO */
83} 82}
84 83
85#endif 84#endif
85
86/* vim: set et sw=2 ts=2: */
diff --git a/ue5/verwendung.cpp b/ue5/verwendung.cpp
index b3506c0..9e10326 100644
--- a/ue5/verwendung.cpp
+++ b/ue5/verwendung.cpp
@@ -5,33 +5,33 @@
5 5
6struct Person 6struct Person
7{ 7{
8 Person (){} 8 Person (){}
9 virtual int mark(){ return 0; } 9 virtual int mark(){ return 0; }
10 virtual ~Person(){} 10 virtual ~Person(){}
11}; 11};
12 12
13struct Student : Person 13struct Student : Person
14{ 14{
15 int m_mark; 15 int m_mark;
16 Student (int mark) : 16 Student (int mark) :
17 m_mark(mark) 17 m_mark(mark)
18 {} 18 {}
19 int mark() 19 int mark()
20 { 20 {
21 return m_mark; 21 return m_mark;
22 } 22 }
23}; 23};
24 24
25struct Pupil : Person 25struct Pupil : Person
26{ 26{
27 int m_mark; 27 int m_mark;
28 Pupil (int mark) : 28 Pupil (int mark) :
29 m_mark(mark) 29 m_mark(mark)
30 {} 30 {}
31 int mark() 31 int mark()
32 { 32 {
33 return m_mark; 33 return m_mark;
34 } 34 }
35}; 35};
36 36
37#include <memory> 37#include <memory>
@@ -68,151 +68,153 @@ using std::vector;
68 68
69int main() 69int main()
70{ 70{
71 try { 71 try {
72 // initialize with new expression 72 // initialize with new expression
73 shared_ptr<Student> n1 (new Student(5)); 73 shared_ptr<Student> n1 (new Student(5));
74 assert (n1.get() != 0); 74 assert (n1.get() != 0);
75 shared_ptr<Person> n2 (new Person); 75 shared_ptr<Person> n2 (new Person);
76 assert (n2.get() != 0); 76 assert (n2.get() != 0);
77 77
78 throw 0; // must be exception safe 78 throw 0; // must be exception safe
79 } catch (...) 79 } catch (...)
80 {} 80 {}
81 81
82 82
83 { 83 {
84 // derived1 is 0. 84 // derived1 is 0.
85 shared_ptr<Student> derived1; 85 shared_ptr<Student> derived1;
86 assert(derived1.get() == 0); 86 assert(derived1.get() == 0);
87 87
88 // Other way for object creation 88 // Other way for object creation
89 derived1 = make_shared<Student>(3); 89 derived1 = make_shared<Student>(3);
90 assert(derived1.get() != 0); 90 assert(derived1.get() != 0);
91 91
92 // Call object member 92 // Call object member
93 derived1->mark(); 93 derived1->mark();
94 94
95 // Object creation with constructor parameters 95 // Object creation with constructor parameters
96 shared_ptr<Student> derived2 = make_shared<Student>(4); 96 shared_ptr<Student> derived2 = make_shared<Student>(4);
97 assert (derived2.get() != 0); 97 assert (derived2.get() != 0);
98 98
99 shared_ptr<Person> base1 = make_shared<Person>(); 99 shared_ptr<Person> base1 = make_shared<Person>();
100 assert (base1.get() != 0); 100 assert (base1.get() != 0);
101 101
102 // Implicit upcast possible. The object make_sharedd in the previous line is 102 // Implicit upcast possible. The object make_sharedd in the previous line is
103 // destroyed, because there are no more pointers referencing it. 103 // destroyed, because there are no more pointers referencing it.
104 base1 = derived1; 104 base1 = derived1;
105 105
106#ifdef SOLVED_1 106#ifdef SOLVED_1
107 // Explicit downcast possible. Some casts that are available: constCast, 107 // Explicit downcast possible. Some casts that are available: constCast,
108 // staticCast, dynamicCast 108 // staticCast, dynamicCast
109 derived2 = shared_dynamic_cast<Student>(base1); 109 derived2 = shared_dynamic_cast<Student>(base1);
110 110
111 // You can compare pointers. 111 // You can compare pointers.
112 assert(derived1 == derived2); 112 assert(derived1 == derived2);
113#endif 113#endif
114 114
115 // Destroy most references to derived instance. References 115 // Destroy most references to derived instance. References
116 // (but not the object itself) are destroyed if they go out 116 // (but not the object itself) are destroyed if they go out
117 // of scope, or you can force reference destruction by multiple ways. 117 // of scope, or you can force reference destruction by multiple ways.
118 derived1.reset(); // release reference 118 derived1.reset(); // release reference
119 assert(derived1.get() == 0); 119 assert(derived1.get() == 0);
120 } 120 }
121 121
122 122
123 { 123 {
124 // array<int, 0> x; // Should fail with static assertion 124 // array<int, 0> x; // Should fail with static assertion
125 125
126 typedef array<shared_ptr<Student>, 5> sarray; 126 typedef array<shared_ptr<Student>, 5> sarray;
127 sarray a; 127 sarray a;
128 a [0] = shared_ptr<Student>(new Student(2)); 128 a [0] = shared_ptr<Student>(new Student(2));
129 a [1] = shared_ptr<Student>(new Student(1)); 129 a [1] = shared_ptr<Student>(new Student(1));
130 a [2] = shared_ptr<Student>(new Student(5)); 130 a [2] = shared_ptr<Student>(new Student(5));
131 a [3] = shared_ptr<Student>(new Student(4)); 131 a [3] = shared_ptr<Student>(new Student(4));
132 a [4] = shared_ptr<Student>(); 132 a [4] = shared_ptr<Student>();
133 assert(a[0].get() != 0); 133 assert(a[0].get() != 0);
134 assert(a[4].get() == 0); 134 assert(a[4].get() == 0);
135 a [4] = shared_ptr<Student>(new Student(4)); 135 a [4] = shared_ptr<Student>(new Student(4));
136 136
137 try { 137 try {
138 a.at(5); // throws exception 138 a.at(5); // throws exception
139 assert(0); 139 assert(0);
140 } catch (std::out_of_range const& oor) { 140 } catch (std::out_of_range const& oor) {
141 oor.what(); 141 oor.what();
142 } catch (...) { 142 } catch (...) {
143 assert(0); 143 assert(0);
144 } 144 }
145 145
146#ifdef SOLVED_2 146#ifdef SOLVED_2
147 array<int,3> a1 = make_array<int,3>(); 147 array<int,3> a1 = make_array<int,3>();
148 a1.fill(3); 148 a1.fill(3);
149 149
150 array<int,3> a2 = make_array<int,3>(); 150 array<int,3> a2 = make_array<int,3>();
151 a2.fill(4); 151 a2.fill(4);
152 152
153 a1.swap(a2); 153 a1.swap(a2);
154 assert(a1[0] == 4); 154 assert(a1[0] == 4);
155 assert(a2[2] == 3); 155 assert(a2[2] == 3);
156#endif 156#endif
157 157
158#ifdef SOLVED_3 158#ifdef SOLVED_3
159 double mean = mean_mark(a.begin(), a.end()); 159 double mean = mean_mark(a.begin(), a.end());
160 assert (mean >= 3.1 || mean <= 3.3); 160 assert (mean >= 3.1 || mean <= 3.3);
161 161
162 double mean_student = mean_mark_student(a.begin(), a.end()); 162 double mean_student = mean_mark_student(a.begin(), a.end());
163 assert (mean_student >= 3.1 || mean_student <= 3.3); 163 assert (mean_student >= 3.1 || mean_student <= 3.3);
164 164
165 sarray::iterator end = remove_greater(a.begin(), a.end(), 3); 165 sarray::iterator end = remove_greater(a.begin(), a.end(), 3);
166 double mean2 = mean_mark(a.begin(), end); 166 double mean2 = mean_mark(a.begin(), end);
167 assert (mean2 >= 1.4 || mean2 <= 1.6); 167 assert (mean2 >= 1.4 || mean2 <= 1.6);
168#endif 168#endif
169 } 169 }
170 170
171 171
172 { 172 {
173 typedef array<shared_ptr<Person>, 5> parray; 173 typedef array<shared_ptr<Person>, 5> parray;
174 parray m; 174 parray m;
175 m [0] = shared_ptr<Student>(new Student(2)); 175 m [0] = shared_ptr<Student>(new Student(2));
176 m [1] = shared_ptr<Pupil>(new Pupil(1)); 176 m [1] = shared_ptr<Pupil>(new Pupil(1));
177 m [2] = shared_ptr<Student>(new Student(5)); 177 m [2] = shared_ptr<Student>(new Student(5));
178 m [3] = shared_ptr<Student>(new Student(4)); 178 m [3] = shared_ptr<Student>(new Student(4));
179 m [4] = shared_ptr<Person>(new Person()); 179 m [4] = shared_ptr<Person>(new Person());
180 180
181#ifdef SOLVED_3 181#ifdef SOLVED_3
182 double mean = mean_mark(m.begin(), m.end()); 182 double mean = mean_mark(m.begin(), m.end());
183 assert (mean >= 2.3 || mean <= 2.5); 183 assert (mean >= 2.3 || mean <= 2.5);
184 184
185 double mean_student = mean_mark_student(m.begin(), m.end()); 185 double mean_student = mean_mark_student(m.begin(), m.end());
186 assert (mean_student >= 3.6 || mean_student <= 3.8); 186 assert (mean_student >= 3.6 || mean_student <= 3.8);
187 187
188 parray::iterator end = remove_greater(m.begin(), m.end(), 3); 188 parray::iterator end = remove_greater(m.begin(), m.end(), 3);
189 double mean2 = mean_mark(m.begin(), end); 189 double mean2 = mean_mark(m.begin(), end);
190 assert (mean2 >= 0.9 || mean2 <= 1.1); 190 assert (mean2 >= 0.9 || mean2 <= 1.1);
191#endif 191#endif
192 } 192 }
193 193
194 { 194 {
195 vector<shared_ptr<Person>> m; 195 vector<shared_ptr<Person>> m;
196 m.push_back(shared_ptr<Student>(new Student(2))); 196 m.push_back(shared_ptr<Student>(new Student(2)));
197 m.push_back(shared_ptr<Pupil>(new Pupil(1))); 197 m.push_back(shared_ptr<Pupil>(new Pupil(1)));
198 m.push_back(shared_ptr<Student>(new Student(5))); 198 m.push_back(shared_ptr<Student>(new Student(5)));
199 m.push_back(shared_ptr<Student>(new Student(4))); 199 m.push_back(shared_ptr<Student>(new Student(4)));
200 m.push_back(shared_ptr<Person>(new Person())); 200 m.push_back(shared_ptr<Person>(new Person()));
201 201
202#ifdef SOLVED_3 202#ifdef SOLVED_3
203 double mean = mean_mark(m.begin(), m.end()); 203 double mean = mean_mark(m.begin(), m.end());
204 assert (mean >= 2.3 || mean <= 2.5); 204 assert (mean >= 2.3 || mean <= 2.5);
205 205
206 double mean_student = mean_mark_student(m.begin(), m.end()); 206 double mean_student = mean_mark_student(m.begin(), m.end());
207 assert (mean_student >= 3.6 || mean_student <= 3.8); 207 assert (mean_student >= 3.6 || mean_student <= 3.8);
208 208
209 assert(m.size() == 5); 209 assert(m.size() == 5);
210 m.erase(remove_greater(m.begin(), m.end(), 3), m.end()); 210 m.erase(remove_greater(m.begin(), m.end(), 3), m.end());
211 assert(m.size() == 3); 211 assert(m.size() == 3);
212 212
213 double mean2 = mean_mark(m.begin(), m.end()); 213 double mean2 = mean_mark(m.begin(), m.end());
214 assert (mean2 >= 0.9 || mean2 <= 1.1); 214 assert (mean2 >= 0.9 || mean2 <= 1.1);
215#endif 215#endif
216 } 216 }
217 217
218} 218}
219
220/* vim: set et sw=2 ts=2: */