summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorKonstantin Käfer <mail@kkaefer.com>2014-12-03 11:27:24 +0100
committerKonstantin Käfer <mail@kkaefer.com>2014-12-03 11:27:24 +0100
commit82f3574d09064a442e30eb2dc7639f473749c5bd (patch)
treedfb0aa6182a0d7d04b6131199d67ff90a87cb9c1 /include
parent50669307c5648e62941a63e0c75dba8602448d9d (diff)
downloadqtlocation-mapboxgl-82f3574d09064a442e30eb2dc7639f473749c5bd.tar.gz
add array overloads to make_unique and move it to mbgl::util from std
Diffstat (limited to 'include')
-rw-r--r--include/mbgl/platform/log.hpp4
-rw-r--r--include/mbgl/util/std.hpp27
2 files changed, 24 insertions, 7 deletions
diff --git a/include/mbgl/platform/log.hpp b/include/mbgl/platform/log.hpp
index 406b3eea37..418160d3ee 100644
--- a/include/mbgl/platform/log.hpp
+++ b/include/mbgl/platform/log.hpp
@@ -3,6 +3,8 @@
#include "event.hpp"
+#include <mbgl/util/std.hpp>
+
#include <memory>
#include <string>
@@ -58,7 +60,7 @@ public:
template<typename T, typename ...Args>
static inline const T &Set(Args&& ...args) {
- Backend = ::std::unique_ptr<T>(new T(::std::forward<Args>(args)...));
+ Backend = util::make_unique<T>(::std::forward<Args>(args)...);
return *dynamic_cast<T *>(Backend.get());
}
diff --git a/include/mbgl/util/std.hpp b/include/mbgl/util/std.hpp
index 051f89bb60..e64820de47 100644
--- a/include/mbgl/util/std.hpp
+++ b/include/mbgl/util/std.hpp
@@ -2,19 +2,34 @@
#define MBGL_UTIL_STD
#include <memory>
+#include <type_traits>
+#include <utility>
-namespace std {
+namespace mbgl {
+namespace util {
+
+// C++14 backfill based on http://llvm.org/svn/llvm-project/libcxx/trunk/include/memory
+
+namespace detail {
+template<class T> struct unique_type { typedef ::std::unique_ptr<T> single; };
+template<class T> struct unique_type<T[]> { typedef ::std::unique_ptr<T[]> unknown_bound; };
+template<class T, size_t size> struct unique_type<T[size]> { typedef void known_bound; };
+}
-// C++14 backfill from http://herbsutter.com/gotw/_102/
-template<typename T, typename ...Args>
-::std::unique_ptr<T> make_unique(Args&& ...args) {
+template<class T, class... Args>
+typename detail::unique_type<T>::single make_unique(Args&&... args) {
return ::std::unique_ptr<T>(new T(::std::forward<Args>(args)...));
}
+template<class T>
+typename detail::unique_type<T>::unknown_bound make_unique(size_t size) {
+ return ::std::unique_ptr<T>(new typename ::std::remove_extent<T>::type[size]());
}
-namespace mbgl {
-namespace util {
+template<class T, class... Args>
+typename detail::unique_type<T>::known_bound make_unique(Args&&...) = delete;
+
+
template <typename Container, typename ForwardIterator, typename Predicate>
void erase_if(Container &container, ForwardIterator it, const ForwardIterator end, Predicate pred) {