diff options
Diffstat (limited to 'src/components/include/utils/make_shared.h')
-rw-r--r-- | src/components/include/utils/make_shared.h | 143 |
1 files changed, 113 insertions, 30 deletions
diff --git a/src/components/include/utils/make_shared.h b/src/components/include/utils/make_shared.h index dc817e362d..9d40d646a6 100644 --- a/src/components/include/utils/make_shared.h +++ b/src/components/include/utils/make_shared.h @@ -48,61 +48,144 @@ * SharedPtr<A> shared2(MakeShared<A>(5, 5.5); * SharedPtr<A> shared3(MakeShared<A>(5, 5.5, std::string("MyStr")); * - * The profit in using MakeShared instead of simple allocation with operator new is evident. - * Firstly it allows us to centralize allocation place, secondly it allows us to use + * The profit in using MakeShared instead of simple allocation with operator new + *is evident. + * Firstly it allows us to centralize allocation place, secondly it allows us to + *use * safe operator new overloading (no throwable one). */ namespace utils { -template <typename T> class SharedPtr; +template <typename T> +class SharedPtr; namespace { template <typename T> - SharedPtr<T>Initialize(T* object) { - return object == NULL ? SharedPtr<T>() : SharedPtr<T>(object); - } +SharedPtr<T> Initialize(T* object) { + return object == NULL ? SharedPtr<T>() : SharedPtr<T>(object); +} } -template<typename T> +template <typename T> SharedPtr<T> MakeShared() { T* t = new (std::nothrow) T; return Initialize(t); } -template<typename T, typename Arg1> +template <typename T, typename Arg1> +SharedPtr<T> MakeShared(Arg1& arg1) { + T* t = new (std::nothrow) T(arg1); + return Initialize(t); +} + +template <typename T, typename Arg1, typename Arg2> +SharedPtr<T> MakeShared(Arg1& arg1, Arg2& arg2) { + T* t = new (std::nothrow) T(arg1, arg2); + return Initialize(t); +} + +template <typename T, typename Arg1, typename Arg2, typename Arg3> +SharedPtr<T> MakeShared(Arg1& arg1, Arg2& arg2, Arg3& arg3) { + T* t = new (std::nothrow) T(arg1, arg2, arg3); + return Initialize(t); +} + +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4> +SharedPtr<T> MakeShared(Arg1& arg1, Arg2& arg2, Arg3& arg3, Arg4& arg4) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4); + return Initialize(t); +} + +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4, + typename Arg5> +SharedPtr<T> MakeShared( + Arg1& arg1, Arg2& arg2, Arg3& arg3, Arg4& arg4, Arg5& arg5) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5); + return Initialize(t); +} + +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4, + typename Arg5, + typename Arg6> +SharedPtr<T> MakeShared( + Arg1& arg1, Arg2& arg2, Arg3& arg3, Arg4& arg4, Arg5& arg5, Arg6& arg6) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5, arg6); + return Initialize(t); +} + +template <typename T, typename Arg1> SharedPtr<T> MakeShared(const Arg1& arg1) { - T* t = new (std::nothrow) T(arg1); - return Initialize(t); + T* t = new (std::nothrow) T(arg1); + return Initialize(t); } -template<typename T, typename Arg1, typename Arg2> +template <typename T, typename Arg1, typename Arg2> SharedPtr<T> MakeShared(const Arg1& arg1, const Arg2& arg2) { - T* t = new (std::nothrow) T(arg1, arg2); - return Initialize(t); + T* t = new (std::nothrow) T(arg1, arg2); + return Initialize(t); } -template<typename T, typename Arg1, typename Arg2, typename Arg3> +template <typename T, typename Arg1, typename Arg2, typename Arg3> SharedPtr<T> MakeShared(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3) { - T* t = new (std::nothrow) T(arg1, arg2, arg3); - return Initialize(t); + T* t = new (std::nothrow) T(arg1, arg2, arg3); + return Initialize(t); } -template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4> -SharedPtr<T> MakeShared(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4) { - T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4); - return Initialize(t); +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4> +SharedPtr<T> MakeShared(const Arg1& arg1, + const Arg2& arg2, + const Arg3& arg3, + const Arg4& arg4) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4); + return Initialize(t); } -template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5> -SharedPtr<T> MakeShared(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5) { - T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5); - return Initialize(t); +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4, + typename Arg5> +SharedPtr<T> MakeShared(const Arg1& arg1, + const Arg2& arg2, + const Arg3& arg3, + const Arg4& arg4, + const Arg5& arg5) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5); + return Initialize(t); } -template<typename T, typename Arg1, typename Arg2, typename Arg3, typename Arg4, typename Arg5, typename Arg6> -SharedPtr<T> MakeShared(const Arg1& arg1, const Arg2& arg2, const Arg3& arg3, const Arg4& arg4, const Arg5& arg5, const Arg6& arg6) { - T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5, arg6); - return Initialize(t); +template <typename T, + typename Arg1, + typename Arg2, + typename Arg3, + typename Arg4, + typename Arg5, + typename Arg6> +SharedPtr<T> MakeShared(const Arg1& arg1, + const Arg2& arg2, + const Arg3& arg3, + const Arg4& arg4, + const Arg5& arg5, + const Arg6& arg6) { + T* t = new (std::nothrow) T(arg1, arg2, arg3, arg4, arg5, arg6); + return Initialize(t); } -} // namespace utils; -#endif // SRC_COMPONENTS_INCLUDE_UTILS_MAKE_SHARED_H_ +} // namespace utils; +#endif // SRC_COMPONENTS_INCLUDE_UTILS_MAKE_SHARED_H_ |