Skip to content
Snippets Groups Projects
Commit 2dfaba6e authored by Nat Goodspeed's avatar Nat Goodspeed
Browse files

DRTVWR-494: Add llmake_heap(); update to variadic llmake().

parent 1f7335fd
No related branches found
No related tags found
No related merge requests found
...@@ -12,10 +12,8 @@ ...@@ -12,10 +12,8 @@
* *
* also relevant: * also relevant:
* *
* Template argument deduction for class templates * Template argument deduction for class templates (C++17)
* http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0091r3.html * https://en.cppreference.com/w/cpp/language/class_template_argument_deduction
* was apparently adopted in June 2016? Unclear when compilers will
* portably support this, but there is hope.
* *
* $LicenseInfo:firstyear=2015&license=viewerlgpl$ * $LicenseInfo:firstyear=2015&license=viewerlgpl$
* Copyright (c) 2015, Linden Research, Inc. * Copyright (c) 2015, Linden Research, Inc.
...@@ -25,37 +23,43 @@ ...@@ -25,37 +23,43 @@
#if ! defined(LL_LLMAKE_H) #if ! defined(LL_LLMAKE_H)
#define LL_LLMAKE_H #define LL_LLMAKE_H
/*==========================================================================*| /**
// When we allow ourselves to compile with C++11 features enabled, this form * Usage: llmake<SomeTemplate>(args...)
// should generically handle an arbitrary number of arguments. *
* Deduces the types T... of 'args' and returns an instance of
* SomeTemplate<T...>(args...).
*/
template <template<typename...> class CLASS_TEMPLATE, typename... ARGS> template <template<typename...> class CLASS_TEMPLATE, typename... ARGS>
CLASS_TEMPLATE<ARGS...> llmake(ARGS && ... args) CLASS_TEMPLATE<ARGS...> llmake(ARGS && ... args)
{ {
return CLASS_TEMPLATE<ARGS...>(std::forward<ARGS>(args)...); return CLASS_TEMPLATE<ARGS...>(std::forward<ARGS>(args)...);
} }
|*==========================================================================*/
// As of 2015-12-18, this is what we'll use instead. Add explicit overloads /// dumb pointer template just in case that's what's wanted
// for different numbers of template parameters as use cases arise. template <typename T>
using dumb_pointer = T*;
/** /**
* Usage: llmake<SomeTemplate>(arg) * Same as llmake(), but returns a pointer to a new heap instance of
* SomeTemplate<T...>(args...) using the pointer of your choice.
* *
* Deduces the type T of 'arg' and returns an instance of SomeTemplate<T> * @code
* initialized with 'arg'. Assumes a constructor accepting T (by value, * auto* dumb = llmake_heap<SomeTemplate>(args...);
* reference or whatever). * auto shared = llmake_heap<SomeTemplate, std::shared_ptr>(args...);
* auto unique = llmake_heap<SomeTemplate, std::unique_ptr>(args...);
* @endcode
*/ */
template <template<typename> class CLASS_TEMPLATE, typename ARG1> // POINTER_TEMPLATE is characterized as template<typename...> rather than as
CLASS_TEMPLATE<ARG1> llmake(const ARG1& arg1) // template<typename T> because (e.g.) std::unique_ptr has multiple template
{ // arguments. Even though we only engage one, std::unique_ptr doesn't match a
return CLASS_TEMPLATE<ARG1>(arg1); // template template parameter that itself takes only one template parameter.
} template <template<typename...> class CLASS_TEMPLATE,
template<typename...> class POINTER_TEMPLATE=dumb_pointer,
template <template<typename, typename> class CLASS_TEMPLATE, typename ARG1, typename ARG2> typename... ARGS>
CLASS_TEMPLATE<ARG1, ARG2> llmake(const ARG1& arg1, const ARG2& arg2) POINTER_TEMPLATE<CLASS_TEMPLATE<ARGS...>> llmake_heap(ARGS&&... args)
{ {
return CLASS_TEMPLATE<ARG1, ARG2>(arg1, arg2); return POINTER_TEMPLATE<CLASS_TEMPLATE<ARGS...>>(
new CLASS_TEMPLATE<ARGS...>(std::forward<ARGS>(args)...));
} }
#endif /* ! defined(LL_LLMAKE_H) */ #endif /* ! defined(LL_LLMAKE_H) */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment