diff options
-rw-r--r-- | contributing.md | 98 | ||||
-rw-r--r-- | src/crepe/ComponentManager.hpp | 13 | ||||
-rw-r--r-- | src/crepe/api/BehaviorScript.h | 5 |
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 { |