]> git.lyx.org Git - lyx.git/commitdiff
unique_ptr and make_unique
authorGuillaume Munch <gm@lyx.org>
Tue, 24 May 2016 22:25:41 +0000 (23:25 +0100)
committerGuillaume Munch <gm@lyx.org>
Thu, 9 Jun 2016 14:21:39 +0000 (15:21 +0100)
configure.ac
src/support/Makefile.am
src/support/unique_ptr.h [new file with mode: 0644]

index 3353df4f4fe88c4c4887bcb8654804ff54895207..52da6ced7fbe7b2226295ff95753c09c45d82d17 100644 (file)
@@ -130,6 +130,9 @@ AC_C_BIGENDIAN
 # Nice to have when an assertion triggers
 LYX_CHECK_CALLSTACK_PRINTING
 
+# C++14 only
+LYX_CHECK_DEF(make_unique, memory, [using std::make_unique;])
+
 # Needed for our char_type
 AC_CHECK_SIZEOF(wchar_t)
 
index 29f003b85d4374084fd93f702bba203904bd0c9a..d926e868f826548c3b3c62e8cf95f0ac58bece74 100644 (file)
@@ -106,6 +106,7 @@ liblyxsupport_a_SOURCES = \
        trivstring.cpp \
        trivstring.h \
        types.h \
+       unique_ptr.h \
        userinfo.cpp \
        userinfo.h \
        unicode.cpp \
diff --git a/src/support/unique_ptr.h b/src/support/unique_ptr.h
new file mode 100644 (file)
index 0000000..f9e049c
--- /dev/null
@@ -0,0 +1,74 @@
+// -*- C++ -*-
+/**
+ * \file unique_ptr.h
+ * This file is part of LyX, the document processor.
+ * Licence details can be found in the file COPYING.
+ *
+ * \author Guillaume Munch
+ *
+ * Full author contact details are available in file CREDITS.
+ */
+
+#ifndef LYX_UNIQUE_PTR_H
+#define LYX_UNIQUE_PTR_H
+
+#include <memory>
+
+namespace lyx { using std::unique_ptr; }
+
+
+/// Define lyx::make_unique() across platforms
+
+#ifdef HAVE_DEF_MAKE_UNIQUE
+
+namespace lyx { using std::make_unique; }
+
+#else
+// For all other compilers:
+// using https://isocpp.org/files/papers/N3656.txt
+
+#include <cstddef>
+#include <type_traits>
+#include <utility>
+
+
+namespace lyx {
+
+namespace {
+
+template<class T> struct _Unique_if {
+       typedef unique_ptr<T> _Single_object;
+};
+
+template<class T> struct _Unique_if<T[]> {
+       typedef unique_ptr<T[]> _Unknown_bound;
+};
+
+template<class T, size_t N> struct _Unique_if<T[N]> {
+       typedef void _Known_bound;
+};
+
+} //anon namespace
+
+template<class T, class... Args>
+typename _Unique_if<T>::_Single_object
+make_unique(Args&&... args) {
+       return unique_ptr<T>(new T(std::forward<Args>(args)...));
+}
+
+template<class T>
+typename _Unique_if<T>::_Unknown_bound
+make_unique(size_t n) {
+       typedef typename std::remove_extent<T>::type U;
+       return unique_ptr<T>(new U[n]());
+}
+
+template<class T, class... Args>
+typename _Unique_if<T>::_Known_bound
+make_unique(Args&&...) = delete;
+
+} // namespace lyx
+
+#endif // definition of make_unique
+
+#endif // LYX_UNIQUE_PTR_H