Gobelijn API documentation  - generated for commit a0cbea7
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros Pages
Motorcycle.cpp
Go to the documentation of this file.
1 
7 #include "objtracer/Motorcycle.h"
8 #include "tracer/tracer.h"
9 #include "util/Exception.h"
10 
11 #include <memory>
12 
13 namespace ODemo {
14 
15 using namespace std;
17 
19  : m_engine(new Engine(10.0)), m_body(new Body()), m_owner(nullptr), m_wheels(std::array<Wheel, 2>()), m_speed(0.0),
20  m_direction(0.0)
21 {
23  m_wheels[0] = Wheel();
24  m_wheels[1] = Wheel();
25 }
26 
27 Motorcycle::Motorcycle(const shared_ptr<Engine>& enginePtr)
28  : m_engine(enginePtr), m_body(new Body()), m_owner(nullptr), m_wheels(std::array<Wheel, 2>()), m_speed(0.0),
29  m_direction(0.0)
30 {
32 }
33 
34 Motorcycle::Motorcycle(const shared_ptr<Engine>& enginePtr, const Person* ownerPtr)
35  : m_engine(enginePtr), m_body(new Body()), m_owner(ownerPtr), m_wheels(std::array<Wheel, 2>()), m_speed(0.0),
36  m_direction(0.0)
37 {
39 }
40 
42  : m_engine(nullptr), m_body(new Body(*ori.m_body)), m_owner(ori.m_owner), m_wheels(ori.m_wheels),
43  m_speed(ori.m_speed), m_direction(ori.m_direction)
44 {
46  if (ori.m_engine) {
47  m_engine = make_shared<Engine>(*ori.m_engine);
48  }
49 }
50 
52  : m_engine(std::move(ori.m_engine)), m_body(std::move(ori.m_body)), m_owner(ori.m_owner),
53  m_wheels(std::move(ori.m_wheels)), m_speed(ori.m_speed), m_direction(ori.m_direction)
54 {
56  ori.m_engine = nullptr;
57  ori.m_body = nullptr;
58  ori.m_wheels = array<Wheel, 2>();
59  ori.m_owner = nullptr;
60  ori.m_speed = 0.0;
61  ori.m_direction = 0.0;
62 }
63 
65 {
67  if (this != &rhs) {
68  if (rhs.m_engine == nullptr) {
69  m_engine = nullptr;
70  } else {
71  m_engine = make_shared<Engine>(*rhs.m_engine);
72  }
73  m_body = make_unique<Body>(*rhs.m_body);
74  m_wheels = rhs.m_wheels;
75  m_owner = rhs.m_owner;
76  m_speed = rhs.m_speed;
78  }
79  return *this;
80 }
81 
83 {
85  if (this != &rhs) {
86  m_engine = std::move(rhs.m_engine);
87  m_body = std::move(rhs.m_body);
88  m_wheels = std::move(rhs.m_wheels);
89  m_owner = rhs.m_owner;
90  m_speed = rhs.m_speed;
91  m_direction = rhs.m_direction;
92 
93  rhs.m_engine = nullptr;
94  rhs.m_body = nullptr;
95  rhs.m_wheels = array<Wheel, 2>();
96  rhs.m_owner = nullptr;
97  rhs.m_speed = 0.0;
98  rhs.m_direction = 0.0;
99  }
100  return *this;
101 }
102 
104 
106 {
108  if (m_engine == nullptr) {
109  throw Exception("Motorcycle::startEngine> Motorcycle without engine cannot start !");
110  }
111  if (!m_engine->is_running()) {
112  m_engine->start();
113  m_speed = 0.0;
114  }
115 }
116 
118 {
120  if (m_engine == nullptr) {
121  throw Exception("Motorcycle without engine cannot stop !");
122  }
123  if (m_engine->is_running()) {
124  if (m_speed > 0.0) {
125  halt();
126  }
127  m_engine->stop();
128  }
129 }
130 
131 void Motorcycle::accelerate(double speed)
132 {
134  if (m_engine == nullptr) {
135  throw Exception("Motorcycle without engine cannot accelerate !");
136  }
137  if (m_engine->is_running() & (m_speed < speed)) {
138  m_speed = speed;
139  }
140 }
141 
142 void Motorcycle::brake(double speed)
143 {
145  if (m_engine == nullptr) {
146  throw Exception("Motorcycle without engine cannot brake !");
147  }
148  if (m_engine->is_running() & (m_speed > speed)) {
149  m_speed = speed;
150  }
151 }
152 
154 {
156  brake(0.0);
157 }
158 
159 void Motorcycle::turn(double degrees)
160 {
162  if (m_speed > 0.0) {
163  m_direction += degrees;
164  }
165 }
166 
167 double Motorcycle::getSpeed() const
168 {
170  return m_speed;
171 }
172 
174 {
176  if (m_engine == nullptr) {
177  throw Exception("Motorcycle without engine cannot run !");
178  }
179  return m_engine->is_running();
180 }
181 
182 shared_ptr<Engine> Motorcycle::get_engine()
183 {
185  return m_engine;
186 }
187 
189 {
191  return m_owner;
192 }
193 
194 void Motorcycle::set_engine(shared_ptr<Engine> const& newEnginePtr)
195 {
197  m_engine = newEnginePtr;
198 }
199 
200 void Motorcycle::set_owner(Person* newOwnerPtr)
201 {
203  m_owner = newOwnerPtr;
204 }
205 
206 } // namespace ODemo
~Motorcycle()
Destructor.
Definition: Motorcycle.cpp:103
std::shared_ptr< Engine > m_engine
Definition: Motorcycle.h:84
Comprehensive include file for all tracer classes.
Simple Exception root class.
A really simple class for Wheel.
Definition: Wheel.h:13
double getSpeed() const
Return current speed.
Definition: Motorcycle.cpp:167
Implementation for exception.
Engine that provides motion.
Definition: Engine.h:12
Motorcycle with Engine and Owner.
Definition: Motorcycle.h:20
std::unique_ptr< Body > m_body
Definition: Motorcycle.h:85
Extremely simple Exception root class.
void stopEngine()
Stop the motorcycle engine.
Definition: Motorcycle.cpp:117
A fairly simple class for Person.
Definition: Person.h:17
void brake(double speed)
Brake until given speed.
Definition: Motorcycle.cpp:142
void halt()
Brake to zero speed, keep engine running.
Definition: Motorcycle.cpp:153
bool is_running() const
Indicates whether engine is running or not.
Definition: Motorcycle.cpp:173
Header for the Motorcycle class.
std::shared_ptr< Engine > get_engine()
Returns pointer to the Engine (may be 0).
Definition: Motorcycle.cpp:182
#define COMP_MISC_MEMBER_TRACER
Macro for tracking member scope.
Definition: MemberTracer.h:21
void turn(double degrees)
Definition: Motorcycle.cpp:159
Person const * get_owner() const
Returns pointer to the owner (may be 0).
Definition: Motorcycle.cpp:188
Motorcycle & operator=(Motorcycle const &rhs)
Copy assignment.
Definition: Motorcycle.cpp:64
void set_engine(std::shared_ptr< Engine > const &newEnginePtr)
Resets engine.
Definition: Motorcycle.cpp:194
std::array< Wheel, 2 > m_wheels
Definition: Motorcycle.h:87
void set_owner(Person *newOwnerPtr)
Resets owner.
Definition: Motorcycle.cpp:200
double m_direction
Definition: Motorcycle.h:89
void startEngine()
Start the motorcycle engine.
Definition: Motorcycle.cpp:105
void accelerate(double speed)
Accelerate up to given speed.
Definition: Motorcycle.cpp:131
const Person * m_owner
Definition: Motorcycle.h:86
Motorcycle()
Default constructor does not initialize association with engine and owner.
Definition: Motorcycle.cpp:18