Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/activitygen/city/AGAdult.cpp
169678 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2010-2025 German Aerospace Center (DLR) and others.
4
// activitygen module
5
// Copyright 2010 TUM (Technische Universitaet Muenchen, http://www.tum.de/)
6
// This program and the accompanying materials are made available under the
7
// terms of the Eclipse Public License 2.0 which is available at
8
// https://www.eclipse.org/legal/epl-2.0/
9
// This Source Code may also be made available under the following Secondary
10
// Licenses when the conditions for such availability set forth in the Eclipse
11
// Public License 2.0 are satisfied: GNU General Public License, version 2
12
// or later which is available at
13
// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
14
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
15
/****************************************************************************/
16
/// @file AGAdult.cpp
17
/// @author Piotr Woznica
18
/// @author Walter Bamberger
19
/// @author Daniel Krajzewicz
20
/// @author Michael Behrisch
21
/// @date July 2010
22
///
23
// Person in working age: can be linked to a work position.
24
/****************************************************************************/
25
#include <config.h>
26
27
#include <iostream>
28
#include <utils/common/RandHelper.h>
29
#include <utils/common/UtilExceptions.h>
30
#include "AGWorkPosition.h"
31
#include "AGAdult.h"
32
33
34
// ===========================================================================
35
// method definitions
36
// ===========================================================================
37
AGWorkPosition*
38
AGAdult::randomFreeWorkPosition(std::vector<AGWorkPosition>* wps) {
39
std::vector<AGWorkPosition*> freePos;
40
for (std::vector<AGWorkPosition>::iterator i = wps->begin(); i != wps->end(); ++i) {
41
if (!i->isTaken()) {
42
freePos.push_back(&*i);
43
}
44
}
45
if (freePos.empty()) {
46
return nullptr;
47
}
48
return RandHelper::getRandomFrom(freePos);
49
}
50
51
52
AGAdult::AGAdult(int age)
53
: AGPerson(age), work(nullptr) {}
54
55
56
void
57
AGAdult::print() const {
58
std::cout << "- AGAdult: Age=" << age << " Work=" << work << std::endl;
59
}
60
61
62
void
63
AGAdult::tryToWork(double rate, std::vector<AGWorkPosition>* wps) {
64
if (decide(rate)) {
65
// Select the new work position before giving up the current one.
66
// This avoids that the current one is the same as the new one.
67
AGWorkPosition* newWork = randomFreeWorkPosition(wps);
68
69
if (work != nullptr) {
70
work->let();
71
}
72
work = newWork;
73
if (work != nullptr) {
74
work->take(this);
75
}
76
} else {
77
if (work != nullptr) {
78
// Also sets work = 0 with the call back lostWorkPosition
79
work->let();
80
}
81
}
82
}
83
84
85
bool
86
AGAdult::isWorking() const {
87
return (work != nullptr);
88
}
89
90
91
void
92
AGAdult::lostWorkPosition() {
93
work = nullptr;
94
}
95
96
97
void
98
AGAdult::resignFromWorkPosition() {
99
if (work != nullptr) {
100
work->let();
101
}
102
}
103
104
105
const AGWorkPosition&
106
AGAdult::getWorkPosition() const {
107
if (work != nullptr) {
108
return *work;
109
}
110
throw ProcessError("AGAdult::getWorkPosition: Adult is unemployed.");
111
}
112
113
114
/****************************************************************************/
115
116