-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathiterator.cpp
More file actions
83 lines (77 loc) · 2.41 KB
/
iterator.cpp
File metadata and controls
83 lines (77 loc) · 2.41 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
#include <iostream>
#include <vector>
#include <string>
template <typename T, typename U>
class DataIterator {
public:
typedef typename std::vector<T>::iterator iter_type;
DataIterator(U *data, iter_type pos = iter_type()) : m_data(data), m_it(pos) {}
std::vector<T>& operator*() const {
if(m_it >= m_data->begin() && m_it < m_data->end()) {
return *m_it;
}
}
iter_type& operator++() {
m_it++;
return m_it;
}
iter_type& first() {
m_it = m_data->begin();
return m_it;
}
bool isDone() {
return (m_it == m_data->end());
}
private:
U *m_data;
iter_type m_it; // iterator index
};
template <typename T>
class Database {
friend class DataIterator<T, Database>;
public:
void addRow(std::vector<T> row) {
pData.push_back(row);
}
DataIterator<T, Database>* createIterator() {
return new DataIterator<T, Database>(this);
}
DataIterator<T, Database> begin() {
return DataIterator<T, Database>(this, pData.begin());
}
DataIterator<T, Database> end() {
return DataIterator<T, Database>(this, pData.end());
}
private:
std::vector<std::vector<T>> pData;
};
class Student {
public:
Student(int age = -1, double gpa = -1, std::string name = "", std::string home = "") : m_age(age), m_gpa(gpa), m_name(name), m_home(home) {}
int getAge() const { return m_age; }
double getGpa() const { return m_gpa; }
std::string getName() const { return m_name; }
std::string getHome() const { return m_home; }
private:
int m_age;
double m_gpa;
std::string m_name;
std::string m_home;
};
int main() {
Database<Student> school;
// Adding some data to the database
school.addRow({Student(18, 3.5, "Alice", "New York"), Student(19, 3.8, "Bob", "Los Angeles")});
school.addRow({Student(20, 3.9, "Charlie", "Chicago"), Student(21, 3.6, "David", "San Francisco")});
DataIterator<Student, Database<Student>> *it = school.createIterator();
for (it->first(); !it->isDone(); ++(*it)) {
// Dereferencing and using the iterator to print the data
auto row = *it;
for (const auto& student : row) {
std::cout << "Name: " << student.getName() << ", Age: " << student.getAge()
<< ", GPA: " << student.getGpa() << ", Home: " << student.getHome() << std::endl;
}
}
delete it;
return 0;
}