aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--contributing.md98
-rw-r--r--src/crepe/ComponentManager.hpp13
-rw-r--r--src/crepe/api/BehaviorScript.h5
3 files changed, 106 insertions, 10 deletions
diff --git a/contributing.md b/contributing.md
index cd1b6a6..ba8ad68 100644
--- a/contributing.md
+++ b/contributing.md
@@ -78,8 +78,8 @@ that you can click on to open them.
}
```
</td></tr></table></details>
-- Header includes are split into paragraphs separated by a blank line. The
- order is:
+- Header includes (at the top of files) are split into paragraphs separated by
+ a blank line. The order is:
1. system headers (using `<`brackets`>`)
2. relative headers NOT in the same folder as the current file
3. relative headers in the same folder as the current file
@@ -112,6 +112,52 @@ that you can click on to open them.
```
</td></tr></table></details>
- <details><summary>
+ If there is one, the matching template header (<code>.hpp</code>) is included
+ at the bottom of the regular header (<code>.h</code>)
+ </summary><table><tr><th>Good</th><th>Bad</th></tr><tr><td>
+
+ Foo.h:
+ ```cpp
+ #pragma once
+
+ template <typename T>
+ void foo();
+
+ #include "Foo.hpp"
+ ```
+
+ Foo.hpp:
+ ```cpp
+ #pragma once
+ #include "Foo.h"
+
+ template <typename T>
+ void foo() {
+ // ...
+ }
+ ```
+ </td><td>
+
+ Foo.h:
+ ```cpp
+ #pragma once
+
+ template <typename T>
+ void foo();
+ ```
+
+ Foo.hpp:
+ ```cpp
+ #pragma once
+ #include "Foo.h"
+
+ template <typename T>
+ void foo() {
+ // ...
+ }
+ ```
+ </td></tr></table></details>
+- <details><summary>
<code>using namespace</code> may not be used in header files (.h, .hpp), only
in source files (.cpp).
</summary><table><tr><th>Good</th><th>Bad</th></tr><tr><td>
@@ -541,6 +587,54 @@ that you can click on to open them.
#include <crepe/facade/Sound.h>
```
</td></tr></table></details>
+- <details><summary>
+ Ensure exception safety by using RAII classes
+ </summary><table><tr><th>Good</th><th>Bad</th></tr><tr><td>
+
+ ```cpp
+ auto foo = std::make_unique<Foo>();
+ ```
+ </td><td>
+
+ ```cpp
+ Foo* foo = new Foo();
+ // ...
+ delete foo;
+ ```
+ </td></tr></table></details>
+- <details><summary>
+ Do not use C-style memory management APIs (<code>malloc</code>,
+ <code>calloc</code>, <code>free</code>)
+ </summary><table><tr><th>Good</th><th>Bad</th></tr><tr><td>
+
+ ```cpp
+ Foo * foo = new Foo();
+ delete foo;
+ ```
+ </td><td>
+
+ ```cpp
+ Foo * foo = (Foo *) malloc(sizeof(Foo));
+ free(foo);
+ ```
+ </td></tr></table></details>
+- <details><summary>
+ Prefix all class members with <code>this-></code>
+ </summary><table><tr><th>Good</th><th>Bad</th></tr><tr><td>
+
+ ```cpp
+ void Foo::set_value(int value) {
+ this->value = value;
+ }
+ ```
+ </td><td>
+
+ ```cpp
+ void Foo::set_value(int new_value) {
+ value = new_value;
+ }
+ ```
+ </td></tr></table></details>
## CMakeLists-specific
diff --git a/src/crepe/ComponentManager.hpp b/src/crepe/ComponentManager.hpp
index 7616f92..489e188 100644
--- a/src/crepe/ComponentManager.hpp
+++ b/src/crepe/ComponentManager.hpp
@@ -30,11 +30,16 @@ T & ComponentManager::add_component(uint32_t id, Args &&... args) {
// Create a new component of type T (arguments directly forwarded). The
// constructor must be called by ComponentManager.
- unique_ptr<T> instance = unique_ptr<T>(new T(id, forward<Args>(args)...));
+ T * instance_ptr = new T(id, forward<Args>(args)...);
+ if (instance_ptr == nullptr)
+ throw std::bad_alloc();
+
+ T & instance_ref = *instance_ptr;
+ unique_ptr<T> instance = unique_ptr<T>(instance_ptr);
// Check if the vector size is not greater than get_instances_max
- if (instance->get_instances_max() != -1
- && this->components[type][id].size() >= instance->get_instances_max()) {
+ int max_instances = instance->get_instances_max();
+ if (max_instances != -1 && components[type][id].size() >= max_instances) {
// TODO: Exception
throw std::runtime_error(
"Exceeded maximum number of instances for this component type");
@@ -43,7 +48,7 @@ T & ComponentManager::add_component(uint32_t id, Args &&... args) {
// store its unique_ptr in the vector<>
this->components[type][id].push_back(std::move(instance));
- return *instance;
+ return instance_ref;
}
template <typename T>
diff --git a/src/crepe/api/BehaviorScript.h b/src/crepe/api/BehaviorScript.h
index 21638f4..6b1fec7 100644
--- a/src/crepe/api/BehaviorScript.h
+++ b/src/crepe/api/BehaviorScript.h
@@ -5,12 +5,9 @@
#include "../Component.h"
namespace crepe {
+
class ScriptSystem;
class ComponentManager;
-} // namespace crepe
-
-namespace crepe {
-
class Script;
class BehaviorScript : public Component {