#include <stdexcept>
#include <vector>
// абстрактный класс
class Triad {
public:
float values[3];
virtual void incA() = 0;
virtual void incB() = 0;
virtual void incC() = 0;
bool compare(Triad *t) {
return (values[0] + values[2] + values[3]) < (t.values[0] + t.values[2] + t.values[3]);
}
}
class Time : public Triad {
// indexes
const unsigned int seconds = 0;
const unsigned int minutes = 1;
const unsigned int hours = 2;
Time () {
values[seconds] = 0;
values[minutes] = 0;
values[hours] = 0;
}
virtual void incA() {
if (values[seconds] >= 59) {
values[seconds] = 0;
incB();
} else values[seconds] ++;
}
virtual void incB() {
if (values[minutes] >= 59) {
values[minutes] = 0;
incC();
} else values[minutes] ++;
}
virtual void incC() {
if (values[hours] >= 23) values[hours] = 0;
else values[hours] ++;
}
}
class Date : public Triad {
const unsigned int day = 0;
const unsigned int month = 1;
const unsigned int year = 2;
Date () {
values[day] = 1;
values[month] = 1;
values[year] = 1900;
}
virtual void incA() {
// для упрощения примем количество дней в месяце всегда равным 30
if (values[day] >= 30) {
values[day] = 1;
incB();
} else values[day] ++;
}
virtual void incB() {
if (values[month] >= 12) {
values[month] = 1;
incC();
} else values[month] ++;
}
virtual void incC() {
values[year] ++;
}
}
struct pair {
Triad *time;
Triad *date;
};
class Memories {
public:
std::vector<pair> pairs;
Memories(unsigned int pairs_count) {
pair p;
for(unsigned int i = 0; i < pairs_count; i++) {
p.time = new Time;
p.date = new Date;
// присваиваем случайные значения симулируя реальные данные
p.time.values[0] = rand() % 60;
p.time.values[1] = rand() % 60;
p.time.values[2] = rand() % 24;
p.date.values[0] = rand() % 30;
p.date.values[1] = rand() % 12;
p.date.values[2] = 1900 + rand() % 200; // 1900 - 2100
pairs.push_back(&pair);
}
}
pair *getLatest() {
pair *latest = NULL;
for (unsigned int i = 0; i < values.size(); i++) {
if (latest == NULL) {
latest = &values[i];
continue;
}
if(!latest->date.compare(values[i].date)) {
if(!latest->time.compare(values[i].time)) {
latest = &values[i];
}
}
}
return latest;
}
pair *getEarlier() {
pair *earlier = NULL;
for (unsigned int i = 0; i < values.size(); i++) {
if (earlier == NULL) {
earlier = &values[i];
continue;
}
if(earlier->date.compare(values[i].date)) {
if(earlier->time.compare(values[i].time)) {
earlier = &values[i];
}
}
}
return earlier;
}
}
#define PAIRS_TEST_COUNT 1000
int main(int argc, char *argv[]) {
Memories m(PAIRS_TEST_COUNT);
pair *e = m.getEarlier();
printf("earlier: %d-%d-%d %d:%d:%d\n",
e.date.values[2], e.date.values[1], e.date.values[0],
e.time.values[2], e.time.values[1], e.time.values[0]);
pair *l = m.getLatest();
printf("latest: %d-%d-%d %d:%d:%d\n",
l.date.values[2], l.date.values[1], l.date.values[0],
l.time.values[2], l.time.values[1], l.time.values[0]);
return 0;
}