diff --git a/configure.ac b/configure.ac index 3353df4f4f..52da6ced7f 100644 --- a/configure.ac +++ b/configure.ac @@ -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) diff --git a/src/support/Makefile.am b/src/support/Makefile.am index 29f003b85d..d926e868f8 100644 --- a/src/support/Makefile.am +++ b/src/support/Makefile.am @@ -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 index 0000000000..f9e049ca0e --- /dev/null +++ b/src/support/unique_ptr.h @@ -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 + +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 +#include +#include + + +namespace lyx { + +namespace { + +template struct _Unique_if { + typedef unique_ptr _Single_object; +}; + +template struct _Unique_if { + typedef unique_ptr _Unknown_bound; +}; + +template struct _Unique_if { + typedef void _Known_bound; +}; + +} //anon namespace + +template +typename _Unique_if::_Single_object +make_unique(Args&&... args) { + return unique_ptr(new T(std::forward(args)...)); +} + +template +typename _Unique_if::_Unknown_bound +make_unique(size_t n) { + typedef typename std::remove_extent::type U; + return unique_ptr(new U[n]()); +} + +template +typename _Unique_if::_Known_bound +make_unique(Args&&...) = delete; + +} // namespace lyx + +#endif // definition of make_unique + +#endif // LYX_UNIQUE_PTR_H