-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRelation.cpp
More file actions
53 lines (45 loc) · 1.3 KB
/
Relation.cpp
File metadata and controls
53 lines (45 loc) · 1.3 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
#include "Relation.h"
#include "Tuple.h"
#include <stdexcept>
Relation::Relation(unsigned int numAttributes) {
this->tuples = new Tuple*[4];
this->numAttributes = numAttributes;
this->cardinality = 0;
this->capacity = 4;
}
Relation::~Relation() {
for (unsigned int i = 0; i < this->cardinality; ++i) {
delete this->tuples[i];
}
delete[] this->tuples;
}
void Relation::resize() {
// Policy: double the capacity
Tuple **newTuples = new Tuple*[this->capacity * 2];
for (unsigned int i = 0; i < this->capacity; ++i) {
newTuples[i] = this->tuples[i];
}
this->capacity *= 2;
delete[] this->tuples;
this->tuples = newTuples;
}
unsigned int Relation::getNumAttributes() const {
return this->numAttributes;
}
unsigned int Relation::getCardinality() const {
return this->cardinality;
}
void Relation::addTuple(const int *values) {
if (this->cardinality == this->capacity) {
this->resize();
}
Tuple *tuple = new Tuple(values, this->numAttributes);
this->tuples[this->cardinality] = tuple;
this->cardinality += 1;
}
const Tuple *Relation::getTuple(unsigned int index) const {
if (index >= this->cardinality) {
throw std::invalid_argument("Relation index out of bounds");
}
return this->tuples[index];
}