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