Engine²
Open-source game engine written in C++.
Loading...
Searching...
No Matches
FunctionContainer.hpp
Go to the documentation of this file.
1#pragma once
2
3#include "BaseFunction.hpp"
4
5#include <list>
6#include <memory>
7#include <unordered_map>
8#include <vector>
9
10namespace FunctionUtils {
14template <typename TReturn, typename... TArgs> class FunctionContainer {
15 public:
16 using FunctionType = BaseFunction<TReturn, TArgs...>;
17
24 template <typename T> struct is_derived_from_function_type : std::is_base_of<FunctionType, std::decay_t<T>> {};
25
26 public:
30 FunctionContainer() = default;
31
35 ~FunctionContainer() = default;
36
41
46
50 FunctionContainer(FunctionContainer &&) noexcept = default;
51
55 FunctionContainer &operator=(FunctionContainer &&) noexcept = default;
56
62 template <typename TCallable> FunctionID AddFunction(TCallable callable);
63
69 FunctionID AddFunction(std::unique_ptr<FunctionType> &&function);
70
77 template <typename... TFunctions> decltype(auto) AddFunctions(TFunctions... functions)
78 {
79 std::array<FunctionID, sizeof...(TFunctions)> temp{AddFunction(functions)...};
80 return std::tuple_cat(temp);
81 }
82
87 inline const std::list<std::unique_ptr<FunctionType>> &GetFunctions() { return _orderedFunctions; }
88
93 inline bool IsEmpty() const { return _orderedFunctions.empty(); }
94
99 inline std::size_t Size() const { return _orderedFunctions.size(); }
100
106 std::unique_ptr<FunctionType> DeleteFunction(FunctionID id);
107
108 inline bool Contains(FunctionID id) const { return _idToIterator.contains(id); }
109
110 private:
111 std::list<std::unique_ptr<FunctionType>> _orderedFunctions;
112 std::unordered_map<FunctionID, typename std::list<std::unique_ptr<FunctionType>>::iterator>
114};
115} // namespace FunctionUtils
116
117#include "FunctionContainer.inl"
Base class for all functions contained in a FunctionContainer.
Definition BaseFunction.hpp:10
bool IsEmpty() const
Returns true if the container is empty.
Definition FunctionContainer.hpp:93
const std::list< std::unique_ptr< FunctionType > > & GetFunctions()
Gets the list of functions in the container.
Definition FunctionContainer.hpp:87
~FunctionContainer()=default
Default destructor for FunctionContainer.
BaseFunction< void, TArgs... > FunctionType
Definition FunctionContainer.hpp:16
FunctionContainer()=default
Default constructor for FunctionContainer.
std::size_t Size() const
Returns the number of functions in the container.
Definition FunctionContainer.hpp:99
FunctionContainer(FunctionContainer &&) noexcept=default
Move constructor.
FunctionContainer & operator=(const FunctionContainer &)=delete
Deleted copy assignment (FunctionContainer is not copyable due to unique_ptr).
decltype(auto) AddFunctions(TFunctions... functions)
Definition FunctionContainer.hpp:77
FunctionContainer(const FunctionContainer &)=delete
Deleted copy constructor (FunctionContainer is not copyable due to unique_ptr).
std::unordered_map< FunctionID, typename std::list< std::unique_ptr< FunctionType > >::iterator > _idToIterator
Definition FunctionContainer.hpp:113
bool Contains(FunctionID id) const
Definition FunctionContainer.hpp:108
std::unique_ptr< FunctionType > DeleteFunction(FunctionID id)
Deletes a function from the container.
Definition FunctionContainer.inl:60
std::list< std::unique_ptr< FunctionType > > _orderedFunctions
Definition FunctionContainer.hpp:111
Definition BaseFunction.hpp:6
std::size_t FunctionID
FunctionID class to represent a unique identifier for functions.
Definition FunctionID.hpp:9
Type trait to check if a type is derived from BaseFunction.
Definition FunctionContainer.hpp:24